用单片机控制直流电机的速度
直流调速器就是调节直流电动机速度的设备,上端和交流电源连接,下端和直流
电动机连接,直流调速器将交流电转化成两路输出直流电源,一路输入给直流电
机砺磁(定子),一路输入给直流电机电枢(转子),直流调速器通过控制电枢
直流电压来调节直流电动机转速。同时直流电动机给调速器一个反馈电流,调速
器根据反馈电流来判断直流电机的转速情况,必要时修正电枢电压输出,以此来
再次调节电机的转速。
直流电机的调速方案一般有下列 3 种方式:
1、改变电枢电压;
2、改变激磁绕组电压;
3、改变电枢回路电阻。
使用单片机来控制直流电机的变速,一般采用调节电枢电压的方式,通过单片机
控制 PWM1,PWM2,产生可变的脉冲,这样电机上的电压也为宽度可变的脉冲电压。
根据公式
U=aVCC
其中:U 为电枢电压;a 为脉冲的占空比(0
电动机的电枢电压受单片机输出脉冲控制,实现了利用脉冲宽度调制技术(PWM)
进行直流电机的变速。
因为在 H 桥电路中,只有 PWM1 与 PWM2 电平互为相反时电机才能驱动,也就是 PWM1 与 PWM2
同为高电平或同为低电平时,都不能工作,所以上图中的实际脉冲宽度为 B,
我们把 PWM 波的周期定为 1ms,占空比分 100 级可调(每级级差为 10%),这样
定时器 T0 每 0.01ms 产生一次定时中断,每 100 次后进入下一个 PWM 波的周期。
上图中,占空比是 60%,即输出脉冲的为 0.6ms,断开脉冲为 0.4ms,这样电枢
电压为 5*60%=3V。
我们讨论的是可以正转反转的,如果只按一个方向转,我们就只要把 PWM1 置为
高电平或低电平,只改变另一个 PWM2 电平的脉冲变化即可,,如下图(Q4 导通,
Q3 闭合,电机只能顺时针调整转动速度)
C 语言代码:
#include
#define uchar unsigned char
#define uint unsigned int
sbit K5=P1^4;
sbit K6=P1^5;
sbit PWM1=P1^0;
sbit PWM2=P1^1;
sbit FMQ=P3^6;
uchar ZKB1,ZKB2;
void delaynms(uint aa)
{
uchar bb;
while(aa--)
{
for(bb=0;bb<115;bb++)
//1ms 基准延时程序
{
}
;
}
}
void delay500us(void)
{
int j;
for(j=0;j<57;j++)
{
;
}
}
void beep(void)
{
uchar t;
for(t=0;t<100;t++)
{
delay500us();
FMQ=!FMQ;
//产生脉冲
}
FMQ=1;
delaynms(300);
//关闭蜂鸣器
}
void main(void)
{
TR0=0;
TMOD=0x01;
TH0=(65526-100)/256;
TL0=(65526-100)%256;
EA=1;
ET0=1;
TR0=1;
ZKB1=50;
ZKB2=50;
while(1)
{
if(!K5)
{
//关闭定时器 0
//定时器 0,工作方式 1
//开总中断
//开定时器 0 中断
//启动定时器 T0
//占空比初值设定
//占空比初值设定
//100us 即 0.01ms 中断一次
delaynms(15);
if(!K5)
{
beep();
ZKB1++;
//消抖
//确定按键按下
//增加 ZKB1
ZKB2=100-ZKB1;
//相应的 ZKB2 就减少
}
}
if(!K6)
{
delaynms(15);
if(!K6)
{
beep();
ZKB1--;
//消抖
//确定按键按下
//减少 ZKB1
ZKB2=100-ZKB1;
//相应的 ZKB2 增加
}
}
if(ZKB1>99)
ZKB1=1;
if(ZKB1<1)
ZKB1=99;
}
}
void time0(void) interrupt 1
{
static uchar N=0;
TH0=(65526-100)/256;
TL0=(65526-100)%256;
N++;
if(N>100)
N=0;
if(N<=ZKB1)
PWM1=0;
else
PWM1=1;
if(N<=ZKB2)
PWM2=0;
else
PWM2=1;
}
//显现:电机转速到最高后,也就是 N 为 1 或 99 时,再按一下,就变到 99 或 1,
//电机反方向旋转以最高速度
程序 / PWM 控制 DC 电机转速
// 晶振为 12M
// 利用定时器控制产生占空比可变的 PWM 波
// 按 K1,PWM 值增加,则占空比增加,电机转快
// 按 K2,PWM 值减小,则占空比减小,电机转慢。
// 当 PWM 值增加到最大值(255)或减小到最小值(1)时,蜂鸣器将报警。
#include < reg52.h >
sbit K1 =P1^0 ; //增加键
sbit K2 =P1^1 ; //减少键
sbit K3 =P1^2 ; //转向选择键
sbit PWMUOT =P3^0 ; //PWM 波输出
sbit turn_around =P3^1 ; //转向控制输出
//sbit BEEP =P3^2 ; //蜂鸣器
unsigned int PWM;
void Beep(void);
void delay(unsigned int n);
void main(void)
{
TMOD=0x11;//设置 T0、T1 为方式 1(16 位定时器)
TH0=0 ; //65536us 延时常数(t=(65536-TH)/fosc/12)
TL0=0;
TH1=PWM ; //脉宽调节,高 8 位
TL1=0;
EA=1; //开总中断
ET0=1; //开 T0 中断
ET1=1; //开 T1 中断
TR0=1 ; //T0 定时允许
while(1)
{
keyscan() ;
}
void timer0() interrupt 1 using 2// 定时器 0 中断服务程序.
{
TR1=0 ; //T1 禁止
TH0=0 ; //置 T0 定时常数
TL0=0 ;
TH1=PWM ; //置 T1 定时常数
TL1=0;
TR1=1 ; //T1 允许
PWMUOT=0 ; //PWM 波输出 0
}
void timer1() interrupt 3 using 3 // 定时器 1 中断服务程序
{
TR1=0 ; //T1 禁止
PWMUOT=1 ; //PWM 波输出 1
}
/*void Beep(void) //蜂鸣器子程序
{
unsigned char i;
for (i=0;i<100;i++)
{
delay(100);
BEEP=!BEEP; //Beep 取反
}
BEEP=1; //关闭蜂鸣器*/
delay(100);
}
void delay(unsigned int n) // 延时子程序
{