如何设置32G单片机的高级PWM两个通道用不同的占空比
老师们,32G单片机的高级PWM,想要PWM1和PWM2用不同的占空比,应该怎么写?比如PWM1用50%的占空比,PWM2用90%的占空比。刚才好像有人工智能回答过。但是看的云里雾里的。新人小白,能不能来一段具体代码学习一下。。。,谢谢了。。#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; //启动计数器
}
老师们,如何让P20和P24用不同的占空比,,我现在只要修改PWMA_CCR的值,,两个都会变
老师们,这个代码应该如何修改才能让P20和P24用两个不同的占空比?
耀子 发表于 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:39
void Io_Init(void)
{
P0M1 = 0xff; // P00:高阻 P01:高阻 P02:高阻 P03:高阻
老师,这个工具在哪下载?
耀子 发表于 2025-3-8 14:45
老师,这个工具在哪下载?
https://www.stcaimcu.com/forum.php?mod=viewthread&tid=10852 已经解决,感谢老师
页:
[1]