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~99if(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