单片机控制电机的原理 关于单片机电机驱动模块( 二 )


EA = 1; //打开总中断
}
函数名称:variable_init功 能:变量、标志初始化
void variable_init() //初始化
{
count_beat = 0; //赋占空比初值
count_time = 100;
forward_flag = 1; //步进电机正转
suspend_flag = 0; //电机继续
stop_flag = 1; //电机停止
}
void main()/*————-主函数———-*/
{
uchar key_val; //定义变量
variable_init(); //变量初始化
interrupt_init(); //中断初始化
while(1)
{
key_val = key_scan(); //按键扫描,判断哪个按键按下
key_behav(key_val); //按键按下,判断实现的功能
}
}
函数名称:moto_run功 能:中断函数;产生控制电机的PWM波形返 回 值:无
void moto_run() interrupt 1
{
TH0 = (65536-T0_COUNT)/256; //定时器赋初值
TL0 = (65536-T0_COUNT)%256;
count++;
if((count>=count_time))
{
count = 0;
if(forward_flag) //步进电机正转
MOTOR = forward[count_beat];
else //步进电机反转
MOTOR = reverse[count_beat];
count_beat++;
}
if(count_beat>7)
count_beat=0;
}

单片机控制电机的原理 关于单片机电机驱动模块

文章插图
用单片机仿真板发出脉冲信号由ULN2003驱动5伏步进电机
二、直流电机控制
用单片机控制直流电机,我们都知道由于单片机I/O的灌电流仅有10毫安左右,工作电压为5伏,要驱动额定电压为12伏,额定电流为几百毫安的直流电动机,必须增加驱动电路,才能提供大的驱动电流,我们常用的直流电动机驱动电路有继电器控制的驱动电路、有三极管组成的H桥驱动电路、电机驱动芯片、达林顿管驱动器等 。我了达到电机正反转,我焊接了一个由三极管组成的驱动桥电路,来驱动电机的正反转 。
单片机控制电机的原理 关于单片机电机驱动模块

文章插图
微型直流电机驱动桥
1)连接:
(1)将P2.0、P2.1口接到P31(在直流电机模块的左侧)的DC_A、DC_B上 。
(2)将B1(直流电机驱动模块输出)接到直流电机上 。
(3)将P3.3口接到某一个LED接口上(P8或P17) 。作为直流电机状态指示灯:亮,直 流电机运行;灭,直流电机停止
2)电源:将P36(直流电机驱动模块的左上角)接口用短接冒短接,电源+5V
3)按键命名:与P1低位到高位依次连接的按键一下命名为按键1~8
4)效果:启动程序,直流电机默认停止状态,运行指示灯熄灭
按键1:在直流电机运行的状态下,直流电机加速
按键2:在直流电机运行的状态下,直流电机减速
按键3:在直流电机运行的状态下,直流电机正反转切换
按键4:直流电机暂停/继续
按键5:直流电机停止/运行
单片机控制电机的原理 关于单片机电机驱动模块

文章插图
直流电机控制原理图
单片机控制电机的原理 关于单片机电机驱动模块

文章插图
直流电机仿真图
直流电机控制参考程序
#include
#define uchar unsigned char
#define uint unsigned int
#define T0_COUNT 100 //定时器0的计数值
#define KEY P1 //按键控制
#define PWM 100 //PWM计数值的上限值
#define INIT_VAL_PWM 20 //PWM占空比初始值
#define INCREMENT_PWM 10 //PWM控制时的增量大小
sbit DC_Moto_A = P2^0; //脉冲输入引脚
sbit DC_Moto_B = P2^1;
sbit LED = P3^3; //LED指示灯接口
uchar count_PWM; //PWM计数值
uchar val_PWM; //PWM占空比的值(加速可调)
bit forward_flag; //电机正反转标志,1:电机正转 0:电机反转
bit stop_flag; //电机停止/运行标志 1:停止 0;运行
bit suspend_flag; //电机暂停/继续标志 1:暂停 0:继续
函数名称:delay_ms,形参:uint n:延时时间的长度,功能是软件延时,延时的单位时间在1ms左右
void delay_ms(uint n)
{
uint i;
uchar j;
for(i=0;i<n;i++)
for(j=0;j<120;j++);
}
函数名称:key_scan,功能:按键扫描,返 回 值:扫描的结果,”0″为无按键按下、非”0″为按键值
uchar key_scan() //按键检测
{
uchar temp = 0;
KEY = 0xff;
if(KEY!=0xff) //按键消抖
{
delay_ms(10);
KEY = 0xff;
if(KEY!=0xff)
{
temp = KEY;
while(KEY!=0xff) //等待按键释放
KEY = 0xff;
}
}
return temp;
}
函数名称:key_behav,形 参:uchar key_val:按键值,功能:实现按键功能
void key_behav(uchar key_val)