找回密码
 立即注册
查看: 138|回复: 7

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

[复制链接]
  • 打卡等级:常住居民II
  • 打卡总天数:90
  • 最近打卡:2025-04-12 15:58:13

24

主题

70

回帖

644

积分

高级会员

积分
644
发表于 2025-3-8 14:12:03 | 显示全部楼层 |阅读模式
老师们,32G单片机的高级PWM,想要PWM1和PWM2用不同的占空比,应该怎么写?比如PWM1用50%的占空比,PWM2用90%的占空比。刚才好像有人工智能回答过。但是看的云里雾里的。新人小白,能不能来一段具体代码学习一下。。。,谢谢了。。
回复

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:90
  • 最近打卡:2025-04-12 15:58:13

24

主题

70

回帖

644

积分

高级会员

积分
644
发表于 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;               //启动计数器
        
   
   
}

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:90
  • 最近打卡:2025-04-12 15:58:13

24

主题

70

回帖

644

积分

高级会员

积分
644
发表于 2025-3-8 14:17:58 | 显示全部楼层
老师们,如何让P20和P24用不同的占空比,,我现在只要修改PWMA_CCR的值,,两个都会变

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:90
  • 最近打卡:2025-04-12 15:58:13

24

主题

70

回帖

644

积分

高级会员

积分
644
发表于 2025-3-8 14:20:57 | 显示全部楼层
老师们,这个代码应该如何修改才能让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; //  详情 回复 发表于 2025-3-8 14:39
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:458
  • 最近打卡:2025-05-01 07:48:22
已绑定手机
已实名认证

110

主题

2219

回帖

5452

积分

版主

积分
5452
发表于 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;
        }
}

截图202503081439147619.jpg

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:90
  • 最近打卡:2025-04-12 15:58:13

24

主题

70

回帖

644

积分

高级会员

积分
644
发表于 2025-3-8 14:45:36 | 显示全部楼层
王*** 发表于 2025-3-8 14:39
void Io_Init(void)
{
        P0M1 = 0xff;                // P00:高阻 P01:高阻 P02:高阻 P03:高阻

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

点评

https://www.stcaimcu.com/forum.php?mod=viewthread&tid=10852  详情 回复 发表于 2025-3-8 14:58
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:458
  • 最近打卡:2025-05-01 07:48:22
已绑定手机
已实名认证

110

主题

2219

回帖

5452

积分

版主

积分
5452
发表于 2025-3-8 14:58:47 | 显示全部楼层
回复 支持 1 反对 0

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:90
  • 最近打卡:2025-04-12 15:58:13

24

主题

70

回帖

644

积分

高级会员

积分
644
发表于 2025-3-8 15:14:18 | 显示全部楼层
已经解决,感谢老师
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 02:15 , Processed in 0.163058 second(s), 94 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表