1、定时器预分频设置错误:STM32的定时器可以通过预分频器来调整计数器的时钟频率,从而控制PWM输出的频率。如果预分频设置错误,将导致PWM输出的频率不符合预期。因此,需要仔细检查定时器的预分频设置是否正确。
2、定时器时钟源设置错误:STM32的定时器时钟可以选择内部时钟或外部时钟源,如果时钟源设置错误,也会导致PWM输出的频率不符合预期。因此,需要检查定时器时钟源是否正确。
3、软件实现错误:在使用STM32进行PWM输出时册握伍,需要编写相应的软件程序来实现PWM输出的控制。如果程序实现有误,也会导致PWM输出频率不符合预期。因此,需要检查程序实现是否正确。
4、软件实现错误:在使用STM32进行PWM输出时,需要编写相应的软件程序来实现PWM输出的控制。如果程序实现有误,也会导致PWM输出频率不符合预期。因此,需要检查程序实现是否正确。
#include<reg51.h>
#define Tpwm 0xfc18//PWM周期对应的计数值1ms,基于12MHz晶振
unsigned int duty[]={0,/*0*/
0xff9c/*100us*/,0xff38/*200us*/,0xfed4/*300us*/,\
0xfe70/*400us*/,0xfe0c/*500us*/,0xfda8/*600us*/,\
0xfd44/*700us*/,0xfce0/*800us*/,0xfc7c/*900us*/,\
0xfc18/*1000us*/}//PWM高电平时间
unsigned char i=0
sbit P32 = P3^2
sbit P33 = P3^3
sbit PWMOUT = P2^0
sbit PWMIN1 = P2^1
sbit PWMIN2 = P2^2
bit flag = 1//PWM输出电平状态,1为输出高电平时间,0为输出低电平时间
void delay10ms(int n)
void main(void)
{
PWMOUT = 0//初始化L293D ,停止电机
PWMIN1 = 0
PWMIN2 = 1
EA = 1 //开总中断
IT0 = 1 //中断方式为跳变
IT1 = 1
EX0 = 1 //打开外部中断0
EX1 = 1 //打开外部中断1
ET0 = 1 //开定时器0中断允许
TMOD = 0x01 //设置定时方式
while(1) //等待中断
{
/*在此可以实现其它任务*/
}
}
//10ms延时函数
void delay10ms(int n)
{
int i=0,j
while(n--)
{
for(i=0i<10i++)
{
for(j = 0 j < 125 j++)
}
}
}
void keySpeeddownISR() interrupt 0 //按键中断服务程序
{
EA = 0 //关中断
delay10ms(2) //延时消抖
if (!P32) //确认按键按下,滤除键盘抖动干扰
{//减少PWM高乱裂电平时间
if(i>晌陪仔0)
i--
if((TR0=1) && (i == 0))
{
TR0 = 0
PWMOUT = 0
}
}
EA = 1
}
void keySpeedupISR() interrupt 2 //按键中断服务程序
{
EA = 0 //关中断
delay10ms(2) //延时消抖
if (!P33) //确认按键按下,滤除键盘抖动干扰
{//增加PWM高电平时间
if(i<=10)
i++
if((TR0 == 0) && (i > 0))
{//启动PWM,电机顺时针旋宴汪转
PWMIN1 = 0
PWMIN2 = 1
PWMOUT = 1
TH0 = duty[i]>>8
TL0 = duty[i]&0xff
TR0 = 1
flag = 1
}
}
EA = 1
}
void T0ISR() interrupt 1 //定时器0中断服务程序
{
EA = 0 //关中断
if(flag)
{//高电平时间结束,输出低电平补齐PWM周期
PWMOUT = 0
TH0 = (65535-(duty[i]-Tpwm))>>8
TL0 = (65535-(duty[i]-Tpwm))&0xff
flag = 0
}else
{//周期结束
PWMOUT = 1
TH0 = duty[i]>>8
TL0 = duty[i]&0xff
flag = 1
}
EA = 1
}
仅供参考。学单片机还需自己多多思考和练习
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)