8H8K PWMA 输出互补(PWM1P,PWM1N)当占空比为50%时候两路输出波形相同的疑问
测试STC8H系列-高级PWM相关程序-20240103.rar的STC8H系列-高级PWM相关程序-20240103\高级PWM相关程序\01B-PWMA-4对互补PWM输出P2口例程1.部分源码:
void PWMA_config(void)
{
P_SW2 |= 0x80; //SFR enable
PWMA_PSCR = 0x0000; // 预分频寄存器, 分频 Fck_cnt = Fck_psc/(PSCR[15:0}+1), 边沿对齐PWM频率 = SYSclk/((PSCR+1)*(AAR+1)), 中央对齐PWM频率 = SYSclk/((PSCR+1)*(AAR+1)*2).
PWMA_DTR= 24; // 死区时间配置, n=0~127: DTR= n T, 0x80 ~(0x80+n), n=0~63: DTR=(64+n)*2T,
// 0xc0 ~(0xc0+n), n=0~31: DTR=(32+n)*8T, 0xE0 ~(0xE0+n), n=0~31: DTR=(32+n)*16T,
PWMA_ARR = 2400; // 自动重装载寄存器,控制PWM周期
PWMA_CCER1= 0;
PWMA_CCER2= 0;
PWMA_SR1 = 0;
PWMA_SR2 = 0;
PWMA_ENO = 0;
PWMA_PS = 0;
PWMA_IER = 0;
// PWMA_ISR_En = 0;PWMA_CCMR1= 0x68; // 通道模式配置, PWM模式1, 预装载允许
PWMA_CCR1 = 400; // 比较值, 控制占空比(高电平时钟数)
PWMA_CCER1 |= 0x05; // 开启比较输出, 高电平有效
PWMA_PS |= 1; // 选择IO, 0:选择P1.0 P1.1, 1:选择P2.0 P2.1, 2:选择P6.0 P6.1,
PWMA_ENO |= 0x03; // IO输出允许,bit7: ENO4N, bit6: ENO4P, bit5: ENO3N, bit4: ENO3P,bit3: ENO2N,bit2: ENO2P,bit1: ENO1N,bit0: ENO1P
// PWMA_IER |= 0x02; // 使能中断
输出波形 PWM1P-->P2.0,PWM1N-->P2.1,没有使用死区
2. 修改的地方 PWMA_CCR1 =400 改为PWMA_CCR1 =1200
void PWMA_config(void)
{
P_SW2 |= 0x80; //SFR enable
PWMA_PSCR = 0x0000; // 预分频寄存器, 分频 Fck_cnt = Fck_psc/(PSCR[15:0}+1), 边沿对齐PWM频率 = SYSclk/((PSCR+1)*(AAR+1)), 中央对齐PWM频率 = SYSclk/((PSCR+1)*(AAR+1)*2).
PWMA_DTR= 24; // 死区时间配置, n=0~127: DTR= n T, 0x80 ~(0x80+n), n=0~63: DTR=(64+n)*2T,
// 0xc0 ~(0xc0+n), n=0~31: DTR=(32+n)*8T, 0xE0 ~(0xE0+n), n=0~31: DTR=(32+n)*16T,
PWMA_ARR = 2400; // 自动重装载寄存器,控制PWM周期
PWMA_CCER1= 0;
PWMA_CCER2= 0;
PWMA_SR1 = 0;
PWMA_SR2 = 0;
PWMA_ENO = 0;
PWMA_PS = 0;
PWMA_IER = 0;
// PWMA_ISR_En = 0;PWMA_CCMR1= 0x68; // 通道模式配置, PWM模式1, 预装载允许
PWMA_CCR1 =1200; // 比较值, 控制占空比(高电平时钟数)
PWMA_CCER1 |= 0x05; // 开启比较输出, 高电平有效
PWMA_PS |= 1; // 选择IO, 0:选择P1.0 P1.1, 1:选择P2.0 P2.1, 2:选择P6.0 P6.1,
PWMA_ENO |= 0x03; // IO输出允许,bit7: ENO4N, bit6: ENO4P, bit5: ENO3N, bit4: ENO3P,bit3: ENO2N,bit2: ENO2P,bit1: ENO1N,bit0: ENO1P
// PWMA_IER |= 0x02; // 使能中断
PWMA_CCR1 输出波形 PWM1P-->P2.0,PWM1N-->P2.1,没有使用死区
梁工你好,帮忙看看 我想得到的波形是这样的该怎么设置
芯片STC8H8K64U-45I-LQPF322426A539249.HD
我去帮你喊梁工 可以参阅以下程序:
以下程序是50%互补输出,24Mhz下输出频率为2.5Khz
void Pwm_Init(void)
{
EAXFR = 1; //扩展寄存器(XFR)访问使能
PWMA_PS = 0x01;//设置PWMA的引脚切换
PWMA_CCER1 = 0x00; //写 CCMRx 前必须先清零 CCxE 关闭通道
PWMA_CCMR1 = 0x60;
PWMA_CCER1 = 0x05;
PWMA_CCMR1 = 0x68;
PWMA_ARRH = 0x25;
PWMA_ARRL = 0x80;
PWMA_CCR1H = 0x12;
PWMA_CCR1L = 0xc0;
PWMA_ENO = 0x03;//设置PWMA的输出使能
PWMA_BKR = 0x80;//使能主输出
PWMA_CR1 = 0x81; //使能ARR预装载,开始计时
}
void UpdatePwm(unsigned char num, unsigned int duty)
{
if(num<=3&&duty>9600)return;// dutya不可以超过9600
if(num>=4&&duty>0)return;// dutyb不可以超过0
switch (num)
{
case 1:
PWMA_CCR1H = (unsigned char)(duty >> 8); // 设置占空比时间
PWMA_CCR1L = (unsigned char)(duty);
break;
default:
break;
}
}
我测试了一下,2.5khz2路相位相同的 国学芯用 发表于 2025-1-7 08:43
我去帮你喊梁工
非常感谢 下面这句你注释掉了?
PWMA_CCMR1= 0x68; // 通道模式配置, PWM模式1, 预装载允许 梁工你好,是粘贴的时候,系统给变成这样的。
下面的配置 输出波形 PWM1P-->P2.0,PWM1N-->P2.1,就是互补的吧,测试也不是互补的
PWMA_ARR = 2400; // 自动重装载寄存器,控制PWM周期
PWMA_CCER1= 0;
PWMA_CCER2= 0;
PWMA_SR1 = 0;
PWMA_SR2 = 0;
PWMA_ENO = 0;
PWMA_PS = 0;
PWMA_IER = 0;
// PWMA_ISR_En = 0;
PWMA_CCMR1= 0x68; // 通道模式配置, PWM模式1, 预装载允许
PWMA_CCR1 = 1200; // 比较值, 控制占空比(高电平时钟数)
PWMA_CCER1 |= 0x05; // 开启比较输出, 高电平有效
PWMA_PS |= 1; // 选择IO, 0:选择P1.0 P1.1, 1:选择P2.0 P2.1, 2:选择P6.0 P6.1,
PWMA_ENO |= 0x03; // IO输出允许,bit7: ENO4N, bit6: ENO4P, bit5: ENO3N, bit4: ENO3P,bit3: ENO2N,bit2: ENO2P,bit1: ENO1N,bit0: ENO1P
// PWMA_IER |= 0x02; // 使能中断 泥巴 发表于 2025-1-8 11:43
梁工你好,是粘贴的时候,系统给变成这样的。
下面的配置 输出波形 PWM1P-->P2.0,PWM1N-->P2.1,就是互补的 ...
我有现成的例子,你可以测试一下。直接下载“01B-PWMA-4对互补PWM输出P2口”里的HEX测试。
STC8H系列-高级PWM范例程序下载,2024/1/3 更新
https://www.stcaimcu.com/forum.php?mod=viewthread&tid=1779
(出处: 国芯技术交流网站)
非常感谢大家,已经弄正常了。
页:
[1]