Y_G_G 发表于 2024-8-20 13:12 u16 flash_crc = 0; u16 flash_cnt = 1000; void TM0_Isr() interrupt 1 { flash_crc = (flash_crc + 1) % flash_cnt; if(flash_crc <=5) { P1=0x01; } else if (flash_crc >= (flash_cnt/ 2) && flash_crc <= (flash_cnt/ 2)+5) { P1=0x02; } else P1=0x00; } 屎山代码, ![]() |
| STC8A8K64D4、STC8G2K64S4这些型号非常方便的输出多路带相位差的15位PWM,直接指定输出高低电平的时刻即可。 |
| 首先先确定时基,假如是1000,让定时器执行累加操作,当寄存器内的数据达到了500的时候,让电平进行反转,这样就会输出一个占空比为50 |
|
你这只是相位差,并不是互补,可以试一下这个方案: 定义两个全局变量: u16 flash_crc = 0; u16 flash_cnt = 1000; 在定时器中断中加入flash_crc = (flash_crc + 1) % flash_cnt; 在主函数中或者定时器中断中检测,并输出电平 if(flash_crc >= (flash_cnt/ 2)) { 高电平; } else { 低电平; } 这个是产生50%占空比的 根据 flash_crc 的值,可以输出不同长度的脉冲 |
| 目前使用ARM核的32位单片机的高级定时器都具备互补输出模式,如三星、NXP公司等等。 |
| ST公司有这样MCU,N年前我使用过ST公司STM8S系列单片机开发无刷三相直流电机的控制器,这一系列芯片的高级定时器采用互补输出模式;ARM核STM32系列单片机的高级定时器同样采用互补输出模式,它提供路数比STM8S系列单片机多。可根据实际需要选择。 |