刘佑红 发表于 2023-7-18 11:45 说得很详细,刚好有个项目要用,参考下,谢谢 |
STC8H单片机PWM的寄存器太多,且有些寄存器的功能看着比较相似,手册介绍的也不太清楚,难以区别,设置起来非常困难,我前前后后阅读器多次并反复设置测试,PWM才正常,但其捕捉功能我现在还没明白。 楼主的PWM没有输出,我在STC8H1K16的4N已输出正常,频率和占空比按照预设要求输出,经对比发现对寄存器的设置有以下不同: 1. PWMA_CCMR4。 楼主设置 0x60=0110 0000,我设置的是0x68=0110 1000,我与楼主相比是多开启了占空比数值预装载功能。官方的例程仅是输出PWM测试,不改变占空比CCR和计数周期ARR的数值,所以官方例程没有开启占空比和计数周期预装载功能,在实际应用时大都需要是是调整占空比和频率,更改预装载值,故大多数情况下是开启。 2. PWMA_CCER2。楼主设置0x10=0001 0000,使B4位的CC4E=1,开启的是4P比较功能,我设置的是0x40=0100 0000,使B6位的CC4NE=1,开启的是4N比较功能。 我们开启的是4N功能,故PWMA_CCER2应该设置为0x40才行。 3.楼主没有设置PWMA_PS,即PWMA_PS是复位值0x00,其设置为4N在P1.7脚输出;我设置PWMA_PS = 0x40=0100 0000,设置4N在P2.7脚输出。楼主的是STC8H1K08,4N欲在P3.3输出,设置PWMA_PS= 0xC0才行(11000000)。 4.PWMA_CR1。区别同1,我是开启了ARR预装载功能。 |
Aresxiaogui 发表于 2023-7-18 09:29 我的PWM输出频率范围是1-25KHZ(由外部电压改变频率),系统是12MHZ,PWM时钟不分频。STC8H1K08的P5.4是PWM6口输出,相应的寄存器需作对应修改。 |
刘佑红 发表于 2023-7-17 21:02 请问你的频率设置的多少呢,为什么我用你这个改一下在P54口输出就没有效果呢 |
刚测,正常输出可调PWM,ARR和CCR采用预装载方式,在使用中可随时改变,寄存器初始化可参照设置。采用的STC8H1K16,P2.7脚输出(PWM4N) P_SW2 |= 0x80; //开启P_SW2寄存器1000 0000 PWMA_CCER2 = 0x00; //写CCMRx前必须先清零CCERx关闭通道 PWMA_CCMR4 = 0x68; //设置CC4为PWM输出模式,开启预装载CCR4 0110 1000 //PWMA_CCMR4 = 0x78; //设置CC4为PWM输出模式,开启预装载CCR4 0111 1000(负极性输出) PWMA_CCER2 = 0x40; //0100 0000单独使能CC4N通道(不开CC4P),输出高电平 PWMA_CCR4 = 2500; //设置占空比时间 PWMA_ARR = 5000; //设置周期时间 PWMA_PS = 0x40; //PWM4N在P2.7输出0100 0000 PWMA_ENO = 0x80; //使能PWM4N端口输出1000 0000 PWMA_BKR = 0x80; //使能主输出1000 0000 PWMA_CR1 = 0x81; //开始计时 1000 0001开启自动预装载PWMA_ARR |
楼主搞定了吗,我用P5.4想输出PWM也一直输出不了 |
刘佑红 发表于 2023-6-25 18:33 为什么我用这段代码在keil上进行软件仿真时P3.3一直输出的是高电平呢 |
建议先测试STC官方的例程,然后再修改移植。 |
是设置的问题,以下我测试输出正常,占空比符合设置预期。输出端口也是P3.3 include<stc8h.h> //STC8H1K08 TSSOP20 sbit out = P3^3; //电机PWM信号输出 /*************************主函数**********************************/ void main() { P0M0 = 0x00; P0M1 = 0x00; P1M0 = 0x00; P1M1 = 0x00; P2M0 = 0x00; P2M1 = 0x00; P3M0 = 0x08; P3M1 = 0x00; P5M0 = 0x00; P5M1 = 0x00; P_SW2 = 0x80; PWMB_CCER2 = 0x00; //写CCMRx前必须先清零CCERx关闭通道 PWMB_CCMR3= 0x60; //设置CC7为PWMA输出模式 PWMB_CCER2 = 0x01; //使能CC7通道 PWMB_CCR7 = 5; //设置占空比时间 PWMB_ARR = 999; //设置周期时间 PWMB_ENO = 0x10; //使能PWM7端口输出 PWMB_PS = 0x10; //PWM7在P3.3输出 PWMB_BKR = 0x80; //使能主输出 PWMB_CR1 = 0x01; //开始计时 while (1); } |
有些型号默认输出高阻态,不知道你设置没 还需要用辅助寄存器切换IO口 可以参考PCA相关例程 |
io要配置推挽输出 |
我也正在试验它,也是P3.3输出,我觉得例程是PWM1P脚输出的,要用PWMA通道4在P3.3输出,还需定义输出脚才行,所以在例程的基础上增加了:PWMA_PS = 0xC0; //使能PWM4N端口选在P3.3(14脚),甚至还要改定义PWMA_CCER4和PWMA_CCMR4,但是否可以输出,还没有测试。 void pwmout(u16 zhankong) { P_SW2 |= 0x80; //使能XFR PWMA_CCER1 = 0x00; //写CCMRx前必须先清零CCERx关闭通道 PWMA_CCMR1 = 0x60; //设置CC1为PWMA输出模式 PWMA_CCER1 = 0x01; //使能CC1通道 PWMA_CCR1 = zhankong; //设置占空比时间 PWMA_ARR = 99; //设置周期时间24MHZ时,PWM输出120KHZ PWMA_ENO = 0x80; //使能PWM4N端口输出 PWMA_PS = 0xC0; //使能PWM4N端口选在P3.3(14脚) PWMA_BKR = 0x80; //使能主输出 PWMA_CR1 = 0x01; //开始计时 } |