标题: 关于8系PWM输出设置 STC8H1K08单片机 [打印本页]
作者: happy2058 时间: 2023-4-6 20:23
标题: 关于8系PWM输出设置 STC8H1K08单片机
选用的单片机芯片8H1K08,只有定时器0,1,2 。 用了两路串口分别是57600,9600.一个接屏幕,一个接读卡器。占用两个定时器,最后一个定时器用了计时和别的功能,现在还需要一路IO口输出PWM功能,周期100us ,10us~20us可调,只能用硬件了。对着例程弄了一天了。没输出。IO我已经切换了,下面是我改的。还有时钟也没弄好。
void TxPulse()
{
P_SW2 = 0x80;
PWMA_CCER2 = 0x00; //写CCMRx前必须先清零CCERx关闭通道
PWMA_CCMR4 = 0x60; //设置CC为PWMA输出模式
PWMA_CCER2 = 0x10; //使能CC通道
PWMA_CCR4 = 100; //设置占空比时间
PWMA_ARR = 500; //设置周期时间
PWMA_ENO = 0x80; //使能PWM4N端口输出
PWMA_BKR = 0x80; //使能主输出
PWMA_CR1 = 0x01; //开始计时
}
用的是PWM4N_2 P3.3
作者: 刘佑红 时间: 2023-6-15 23:02
我也正在试验它,也是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; //开始计时
}
作者: zxq9781 时间: 2023-6-21 22:47
io要配置推挽输出
作者: 1241526990 时间: 2023-6-24 02:55
有些型号默认输出高阻态,不知道你设置没
还需要用辅助寄存器切换IO口
可以参考PCA相关例程
作者: 刘佑红 时间: 2023-6-25 18:33
是设置的问题,以下我测试输出正常,占空比符合设置预期。输出端口也是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);
}
作者: coody_sz 时间: 2023-6-25 19:57
建议先测试STC官方的例程,然后再修改移植。
作者: Aresxiaogui 时间: 2023-7-14 09:39
为什么我用这段代码在keil上进行软件仿真时P3.3一直输出的是高电平呢
作者: Aresxiaogui 时间: 2023-7-14 09:42
楼主搞定了吗,我用P5.4想输出PWM也一直输出不了
作者: 刘佑红 时间: 2023-7-17 21:02
刚测,正常输出可调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
作者: Aresxiaogui 时间: 2023-7-18 09:29
请问你的频率设置的多少呢,为什么我用你这个改一下在P54口输出就没有效果呢
作者: 刘佑红 时间: 2023-7-18 10:35
我的PWM输出频率范围是1-25KHZ(由外部电压改变频率),系统是12MHZ,PWM时钟不分频。STC8H1K08的P5.4是PWM6口输出,相应的寄存器需作对应修改。
作者: 刘佑红 时间: 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预装载功能。
作者: coco1016 时间: 2023-8-5 08:31
说得很详细,刚好有个项目要用,参考下,谢谢
欢迎光临 (http://www.51hei.com/bbs/) |
Powered by Discuz! X3.1 |