1、直流电机介绍
直流电机是一种将电能转换为机械能的装置。一般的直流电机有两个电极,当电极正接时,电机正转,当电极反接时,电机反转。
直流电机主要由永磁体(定子)、线圈(转子)和换向器组成。
除直流电机外,常见的电机还有步进电机、舵机、无刷电机、空心杯电机等。
2、电机驱动电路
大功率器件直接驱动 H桥驱动
大功率器件的电机线路加上了二极管,可以防止三极管断电时,电感电压高于电源电压 ,避免电路造成损坏。
3、PWM介绍
PWM(Pulse Width Modulation)即脉冲宽度调制,在具有惯性的系统中,可以通过对一系列脉冲的宽度进行调制,来等效地获得所需要的模拟参量,常应用于电机控速、开关电源等领域
PWM重要参数: 频率 = 1 / TS 占空比 = TON / TS 精度 = 占空比变化步距
频率高了,电机运转更加平缓,频率低了,电机运行会出现抖动。
占空比:TON就是打开的时间,TS就是一个周期的时间。电机转速通过调整占空比实现。
精度:调整占空比变化的精度 。
4、产生PWM方法
蓝色线代表计数器,红色线代表比较值。
比较值在硬件中是一个寄存器,我们可以写入一个固定的比较值,比较值可以决定占空比。
在程序中可以定义一个变量,把它当做一个比较值,如果占空比不变,这个比较值通常也是固定的。
5、直流点击驱动代码
main.c
#include <REGX52.H>
#include "Delay.h"
#include "Key.h"
#include "Nixie.h"
#include "Timer0.h"
sbit Motor=P1^0;
unsigned char Counter,Compare; //计数值和比较值,用于输出PWM
unsigned char KeyNum,Speed;
void main()
{
Timer0_Init();
while(1)
{
KeyNum=Key();
if(KeyNum==1)
{
Speed++;
Speed%=4;
if(Speed==0){Compare=0;} //设置比较值,改变PWM占空比
if(Speed==1){Compare=50;}
if(Speed==2){Compare=75;}
if(Speed==3){Compare=100;}
}
Nixie(1,Speed);
}
}
void Timer0_Routine() interrupt 1
{
TL0 = 0x9C; //设置定时初值
TH0 = 0xFF; //设置定时初值
Counter++;
Counter%=100; //计数值变化范围限制在0~99
if(Counter<Compare) //计数值小于比较值
{
Motor=1; //输出1
}
else //计数值大于比较值
{
Motor=0; //输出0
}
}
time0.c
#include <REGX52.H>
/**
* @brief 定时器0初始化,100us@12.000MHz
* @param 无
* @retval 无
*/
void Timer0_Init(void)
{
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
TL0 = 0x9C; //设置定时初值
TH0 = 0xFF; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0=1;
EA=1;
PT0=0;
}
/*定时器中断函数模板
void Timer0_Routine() interrupt 1
{
static unsigned int T0Count;
TL0 = 0x9C; //设置定时初值
TH0 = 0xFF; //设置定时初值
T0Count++;
if(T0Count>=1000)
{
T0Count=0;
}
}
*/
time0.h
#ifndef __TIMER0_H__
#define __TIMER0_H__
void Timer0_Init(void);
#endif