耀子 发表于 2025-3-8 14:12:03

如何设置32G单片机的高级PWM两个通道用不同的占空比

老师们,32G单片机的高级PWM,想要PWM1和PWM2用不同的占空比,应该怎么写?比如PWM1用50%的占空比,PWM2用90%的占空比。刚才好像有人工智能回答过。但是看的云里雾里的。新人小白,能不能来一段具体代码学习一下。。。,谢谢了。。

耀子 发表于 2025-3-8 14:16:31

#include "STC32G.h"


#define MAIN_Fosc 24000000L   //定义主时钟
#define PWMA_PSCR 0         //设置分频 (分频数 = PSCR + 1)
#define PWMA_ARR 2399      //自动重装最高数

typedef unsigned char u8;
typedef unsigned int u16;
typedef unsigned long u32;

void PWMA_Init(void);

u16 PWMA_CCR = 200;

void main(void)
{
   
   
    P_SW2 |= 0x80;   //扩展寄存器(XFR)访问使能

    P0M1 = 0x00;   P0M0 = 0x00;   //设置为准双向口
    P1M1 = 0x00;   P1M0 = 0x00;   //设置为准双向口
    P2M1 = 0xff;   P2M0 = 0xff;   //设置为准双向口
    P3M1 = 0x00;   P3M0 = 0x00;   //设置为准双向口
    P4M1 = 0x00;   P4M0 = 0x00;   //设置为准双向口
    P5M1 = 0x00;   P5M0 = 0x00;   //设置为准双向口
    P6M1 = 0x00;   P6M0 = 0x00;   //设置为准双向口
    P7M1 = 0x00;   P7M0 = 0x00;   //设置为准双向口
      

      PWMA_Init();
   
   
      while(1)
      {

      }
}


void PWMA_Init(void)//PWMA的初始化
{

      
      //1.时钟源选择
      
      //2.时基单元选择
      
      PWMA_PSCRH = (u8)(PWMA_PSCR >> 8);//预分步寄存器高8位,设置1分频
      PWMA_PSCRL = (u8)(PWMA_PSCR);//预分步寄存器低8位,设置1分频
      
   
      PWMA_ARRH = (u8)(PWMA_ARR >> 8);//自动重载寄存器高8位
      PWMA_ARRL = (u8)(PWMA_ARR);   //自动重载寄存器低8位
      
      PWMA_CCR1H = (u8)(PWMA_CCR >> 8);//计数比较寄存器高位,设置占空比
      PWMA_CCR1L = (u8)(PWMA_CCR);   //计数比较寄存器低位,设置占空比
      
      //3.输入输出引脚配置
      PWMA_ENO = 0X00;       //清空使能输出引脚
      PWMA_ENO |= 0X33;      //设置使能输出PWM1P和PWM3P端口
      

   
   
      PWMA_PS = 0X00;      //先清空引脚配置
      PWMA_PS |= 0X11;       //选择PWM输出IO口为P20和P24
      
   
      //4.输入输出模式配置
      PWMA_CCER1 = 0X00;   //先清零捕获比较寄存器
      PWMA_CCMR1 = 0X68;   //配置捕获比较寄存器1
      PWMA_CCER1 = 0X05;   //开启PWM通道模式为不互补,高电平有效

      //5.下面两个主功能。放在最后
      PWMA_BKR = 0X80;       //配置刹车寄存器,使用主输出
      
      PWMA_CR1 |= 0X01;               //启动计数器
      
   
   
}

耀子 发表于 2025-3-8 14:17:58

老师们,如何让P20和P24用不同的占空比,,我现在只要修改PWMA_CCR的值,,两个都会变

耀子 发表于 2025-3-8 14:20:57

老师们,这个代码应该如何修改才能让P20和P24用两个不同的占空比?

王昱顺 发表于 2025-3-8 14:39:18

耀子 发表于 2025-3-8 14:20
老师们,这个代码应该如何修改才能让P20和P24用两个不同的占空比?

void Io_Init(void)
{
        P0M1 = 0xff;                // P00:高阻 P01:高阻 P02:高阻 P03:高阻
        P0M0 = 0x00;                // P04:高阻 P05:高阻 P06:高阻 P07:高阻
        P1M1 = 0xff;                // P10:高阻 P11:高阻 P12:高阻 P13:高阻
        P1M0 = 0x00;                // P14:高阻 P15:高阻 P16:高阻 P17:高阻
        P2M1 = 0x00;                // P20:推挽 P21:推挽 P22:推挽 P23:推挽
        P2M0 = 0xff;                // P24:推挽 P25:推挽 P26:推挽 P27:推挽
        P3M1 = 0xff;                // P30:高阻 P31:高阻 P32:高阻 P33:高阻
        P3M0 = 0x00;                // P34:高阻 P35:高阻 P36:高阻 P37:高阻
        P4M1 = 0xff;                // P40:高阻 P41:高阻 P42:高阻 P43:高阻
        P4M0 = 0x00;                // P44:高阻 P45:高阻 P46:高阻 P47:高阻
        P5M1 = 0xff;                // P50:高阻 P51:高阻 P52:高阻 P53:高阻
        P5M0 = 0x00;                // P54:高阻 P55:高阻 P56:高阻 P57:高阻
}

void Pwm_Init(void)
{
        EAXFR = 1; //扩展寄存器(XFR)访问使能
        PWMA_PS = 0x11;//设置PWMA的引脚切换
        PWMA_CCER1 = 0x00; //写 CCMRx 前必须先清零 CCxE 关闭通道
        PWMA_CCER2 = 0x00;
        PWMA_CCMR1 = 0x60;
        PWMA_CCMR3 = 0x60;
        PWMA_CCER1 = 0x01;
        PWMA_CCER2 = 0x01;
        PWMA_CCMR1 = 0x68;
        PWMA_CCMR3 = 0x68;
        PWMA_PSCRH = 0x01;
        PWMA_PSCRL = 0x6e;
        PWMA_ARRH = 0xff;
        PWMA_ARRL = 0x73;
        PWMA_CCR1H = 0x7f;
        PWMA_CCR1L = 0xba;
        PWMA_CCR3H = 0xe5;
        PWMA_CCR3L = 0xe8;
        PWMA_ENO = 0x11;//设置PWMA的输出使能
        PWMA_BKR = 0x80;//使能主输出
        PWMA_CR1 = 0x81; //使能ARR预装载,开始计时
}

void UpdatePwm(unsigned char num, unsigned int duty)
{
        if(num<=3&&duty>65395)return;// dutya不可以超过65395
        if(num>=4&&duty>0)return;// dutyb不可以超过0
        switch (num)
        {
        case 1:
                PWMA_CCR1H = (unsigned char)(duty >> 8); // 设置占空比时间
                PWMA_CCR1L = (unsigned char)(duty);
                break;
        case 3:
                PWMA_CCR3H = (unsigned char)(duty >> 8); // 设置占空比时间
                PWMA_CCR3L = (unsigned char)(duty);
                break;
        default:
                break;
        }
}



耀子 发表于 2025-3-8 14:45:36

王昱顺 发表于 2025-3-8 14:39
void Io_Init(void)
{
        P0M1 = 0xff;                // P00:高阻 P01:高阻 P02:高阻 P03:高阻


老师,这个工具在哪下载?

王昱顺 发表于 2025-3-8 14:58:47

耀子 发表于 2025-3-8 14:45
老师,这个工具在哪下载?

https://www.stcaimcu.com/forum.php?mod=viewthread&tid=10852

耀子 发表于 2025-3-8 15:14:18

已经解决,感谢老师
页: [1]
查看完整版本: 如何设置32G单片机的高级PWM两个通道用不同的占空比