proteus的stm32输出的pwm频率和设置的不同

proteus的stm32输出的pwm频率和设置的不同,第1张

proteus的stm32输出的pwm频率和设置的不同的原皮败因是:定时器预分频设置错误、定时器时钟源设置错误、软件实现错误、软件实州或现错误。

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

}

仅供参考。学单片机还需自己多多思考和练习


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12424046.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存