51单片机产生pwm为什么出现这种情况?
频率设置,中断时间设置为10us,定时器周期为1ms,晶振频率为12mhz,理论上pwm周期应该是1khz啊,但示波器怎么显示才300多hz?代码:#include<re...
频率设置,中断时间设置为10us,定时器周期为1ms,晶振频率为12mhz,理论上pwm周期应该是1khz啊,但示波器怎么显示才300多hz?
代码:
#include <reg51.h>
typedef unsigned char uchar;
sbit P1_0=P1^0;
sbit p1_1=P1^1;
uchar time=0;
uchar period=100;
uchar high=50;
void timer0() interrupt 1 using 1
{
TH0=0xff; /*定时器初值重装载*/
TL0=0xf6;
time++;
if(time==high) /*高电平持续时间结束,变低*/
{ P1_0=0;
p1_1=1;
}
else if(time==period) /*周期时间到,变高*/
{ time=0;
P1_0=1;
p1_1=0;
}
}
void main()
{
TMOD=0x01; /*定时器0方式1*/
TH0=0xff; /*定时器装载初值*/
TL0=0xf6;
EA=1; /*开CPU中断*/
ET0=1; /*开定时器0中断*/
TR0=1;/*启动定时器0*/
while(1) /*等待中断*/
{}
} 展开
代码:
#include <reg51.h>
typedef unsigned char uchar;
sbit P1_0=P1^0;
sbit p1_1=P1^1;
uchar time=0;
uchar period=100;
uchar high=50;
void timer0() interrupt 1 using 1
{
TH0=0xff; /*定时器初值重装载*/
TL0=0xf6;
time++;
if(time==high) /*高电平持续时间结束,变低*/
{ P1_0=0;
p1_1=1;
}
else if(time==period) /*周期时间到,变高*/
{ time=0;
P1_0=1;
p1_1=0;
}
}
void main()
{
TMOD=0x01; /*定时器0方式1*/
TH0=0xff; /*定时器装载初值*/
TL0=0xf6;
EA=1; /*开CPU中断*/
ET0=1; /*开定时器0中断*/
TR0=1;/*启动定时器0*/
while(1) /*等待中断*/
{}
} 展开
1个回答
展开全部
我觉得是因为执行一条语句还要1个或多个机械周期,也就是一条语句要几μ秒,误差就这么来了,控制个小车完全没问题了,如果是一定要保证精度的话,可以考虑51加强型或者高端点的单片机
追问
用STC12C5A60S2这块单片机,能解决这样的问题吗
追答
你是要拿来干嘛用,如果是控制用这个加强型比较好,这种型号可以输出2路pwm波,但是如果是模拟的话,他的pwm用的是内部自带的定时器可自动重装,改变比较寄存器的值可以实现无干扰的调节占空比,但是频率只能够通过分频改变,就是说只能是几分之几这种精度,而且频率在几k左右,而且内部振荡源受温度影响较大,如果你要输出精确的频率,可以尝试采用更高级的的单片机比如stm32。。。当然可能是我没想到啥好办法。。。加强型的pwm例程在数据手册上有。
意法半导体(中国)投资有限公司
2023-06-12 广告
2023-06-12 广告
stm32怎么样?这个问题不能一概而论,要根据您的具体情况进行分析。意法半导体单片机产品线拥有业界很宽广、极具创新力的32位产品系列 – STM32,覆盖超低功耗、超高性能方向,同时兼具很强的市场竞争力。STM32是ARM Cortex内核...
点击进入详情页
本回答由意法半导体(中国)投资有限公司提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询