搜档网
当前位置:搜档网 › PWM电机调速原理与51单片机PWM程序经典

PWM电机调速原理与51单片机PWM程序经典

PWM电机调速原理与51单片机PWM程序经典
PWM电机调速原理与51单片机PWM程序经典

Pwm 电机调速原理

对于电机的转速调整,我们是采用脉宽调制(PWM )办法,控制电机的时候,电源并非连续地向电机供电,而是在一个特定的频率下以方波脉冲的形式提供电能。不同占空比的方波信号能对电机起到调速作用,这是因为电机实际上是一个大电感,它有阻碍输入电流和电压突变的能力,因此脉冲输入信号被平均分配到作用时间上,这样,改变在始能端PE2 和PD5 上输入方波的占空比就能改变加在电机两端的电压大小,从而改变了转速。

此电路中用微处理机来实现脉宽调制,通常的方法有两种:

(1)用软件方式来实现,即通过执行软件延时循环程序交替改变端口某个二进

制位输出逻

辑状态来产生脉宽调制信号,设置不同的延时时间得到不同的占空比。(2)硬件实验自动产生PWM 信号,不占用CPU 处理的时间。这就要用到

ATMEGA8515L 的在PWM 模式下的计数器1,具体内容可参考

相关书籍。

51 单片机PWM 程序

产生两个PWM ,要求两个PWM 波形占空都为80/256, 两个波形之间要错开,不能同时为高电平!高电平之间相差48/256 ,

PWM 这个功能在PIC 单片机上就有,但是如果你就要用51 单片机的话,也是可以的,但是比较的麻烦.可以用定时器T0 来控制频率,定时器T1 来控制占空比:大致的的编程思路是这样的:T0 定时器中断是让一个I0 口输出高电平,在这个定时器T0 的中断当中起动定时器T1,而这个T1 是让IO 口输出低电平,这样改变定时器T0 的初值就可以改变频率,改变定时器T1 的初值就可以改变占空比。

*程序思路说明:

*

*

*

*关于频率和占空比的确定,对于12M 晶振,假定PWM 输出频率为1KHZ, 这样定时中断次数*

*设定为C=10 ,即0.01MS 中断一次,则TH0=FF,TL0=F6; 由于设定中断时间为0.01ms ,这样*

*可以设定占空比可从1-100 变化。即0.01ms*100=1ms

*

******************************************************************************/

#include

#define uchar unsigned char

/*****************************************************************************

* TH0 和TL0 是计数器0 的高8 位和低8 位计数器,计算办

法:TL0=(65536-C)%256; *

* TH0=(65536-C)/256, 其中C 为所要计数的次数即多长时间产生一次中断;TMOD 是计数器*

* 工作模式选择,0X01 表示选用模式1,它有16 位计数器,最大计数脉冲为65536, 最长时*

* 间为1ms*65536=65.536ms

*

******************************************************************************/

#define V_TH0 0XFF

#define V_TL0 0XF6

#define V_TMOD 0X01

void init_sys(void); /*系统初始化函数*/

void Delay5Ms(void);

unsigned char ZKB1,ZKB2;

void main (void)

{

init_sys();

ZKB1=40; /*占空比初始值设定*/

ZKB2=70; /*占空比初始值设定*/

while(1)

{

if (!P1_1) // 如果按了+键,增加占空比

{

Delay5Ms();

if (!P1_1)

{

ZKB1++;

ZKB2=100-ZKB1;

}

}

if (!P1_2) // 如果按了-键,减少占空比

{

Delay5Ms();

if (!P1_2)

{

ZKB1--;

ZKB2=100-ZKB1;

}

}

/*对占空比值限定范围*/

if (ZKB1>99) ZKB1=1;

if (ZKB1<1) ZKB1=99;

}

}

/******************************************************

*函数功能:对系统进行初始化,包括定时器初始化和变量初始化*/

void init_sys(void) /*系统初始化函数*/

{

/*定时器初始化*/

TMOD="V"_TMOD;

TH0=V_TH0;

TL0=V_TL0;

TR0=1;

ET0=1;

EA="1";

}

//延时

void Delay5Ms(void)

{

unsigned int TempCyc = 1000;

while(TempCyc--);

}

/*中断函数*/

void timer0(void) interrupt 1 using 2

{

static uchar click="0"; /*中断次数计数器变量*/

TH0=V_TH0; /*恢复定时器初始值*/ TL0=V_TL0;

++click;

if (click>=100) click="0";

if (click<=ZKB1) /*当小于占空比值时输出低电平,高于时是高电平,从而实现占空比的调整*/

P1_3=0;

else

P1_3=1;

if (click<=ZKB2)

P1_4=0;

else

P1_4=1;

} <

1.下面是AVR 的程序,51 产生PWM 波麻烦,可以用AVR。主要是设置存放的TOP 值(OCR1A 的值),然后你要多大的占空比再设置OCR1B 的值,至于持续时间就更简单了,你要产生多久,就调用此函数就可以了哈

2.产生方波的频率计算公式(KHZ)

f=fclk(晶振)/{*N(1+OCRNA)}

N:代表分频因子

根据你要的产生方波的频率,就能算出OCRNA 的值,就可以了!

/*************** 在OCR1B(PD4) 上可测到100HZ 的PWM 波***********************/ /*************** 在OCR1A(PD5) 上可测到50HZ 的方波************************/

#include

#include

void PWM()

{

DDRD=0X30;// 设置OC1B(PD4 )和OC1A (PD5 )为输出

TCCR1A=0X63;

TCCR1B=0X1B;

OCR1A=7;// 得到10KHZ 的PWM 波

OCR1B=5;// 得到2ms(1810/5) 的高电平时间

}

相关主题