文章目录
- 一、介绍直流电机
- 介绍
- 电机驱动电路
- 大功率器件直接驱动
- H桥驱动
- 集成电路线路图
- PWM介绍
- 产生PWM的方法
- 二、实例
- 1.呼吸灯案例
- 2.直流电机调速
一、介绍直流电机
介绍
电机驱动电路
点击的负载较大,直接接在单片机I/O口上无法驱动,所以需要驱动电路
大功率器件直接驱动
续流二极管的作用:
由于电机是感应器件,是电感,在线路断开时会是电压缓慢降下,而此时没有电流,电感就会感应出高电压来产生电流,这样就可能会导致电路损坏。而这个二极管的作用就是在电路断开时,与电机形成回路,延续电流使电机电压缓慢降低。
H桥驱动
IN1与IN4、IN2与IN3形成通路来达到改变方向的效果,不过这种结构无法添加续流二极管,对硬件的耐电性要求较高
集成电路线路图
51单片机采用的是大功率器件直接驱动
IN控制开关
PWM介绍
用于控制电机的速度,通过改变供电、断电,利用电感特性来控制速度。
注意: 不能使用滑动变阻器来实现,长时间的高电流会导致电位器烧毁,使用小电阻也会因为高电流发热烧毁。
产生PWM的方法
使用定时器每隔一段时间中断一次 ,周期间的间隔时间,时间需要短一点
在中断函数中设定循环(即供电与不供电占比),也就是设置的周期值,然后自己设置比较值
模型结构
与波形对比图
二、实例
1.呼吸灯案例
通过改变供电占比实现,设定一个固定周期,通过改变在这个周期里的供电占比即可实现。不过使用延时函数比较占用CPU
#include <REGX52.H>sbit LED = P2^0;
// 快速延时函数
void Delay(t){while(t--);
}void main(){unsigned char Time,i;while(1){// 增大低电平周期占比,增加亮度for(Time = 0;Time < 100;Time++){// 延缓变化速度for(i = 0;i < 20;i++){LED = 0;Delay(Time);LED = 1;Delay(100-Time); // 一次周期定位为100}}// 降低低电平周期占比,降低亮度for(Time = 100;Time > 0;Time--){// 延缓变化速度for(i = 0;i < 20;i++){LED = 0;Delay(Time);LED = 1;Delay(100-Time); // 一次周期定位为100}}}
}
2.直流电机调速
注意:由于单片机默认高电平,所以打开开关的一瞬间电机是通电状态,会转一会
#include <REGX52.H>
#include "Delay.h"
#include "Key.h"
#include "Time0Init.h"
#include "Nixie.h"sbit Motor = P1^0; // 开关引脚unsigned char Counter,Compare; // 周期、比较值
unsigned char KeyNum,Speed;
void main(){Time0_Init();while(1){KeyNum = Key();// 以Speed控制挡位,按键1控制Speedif(KeyNum == 1){Speed++;Speed %= 4; // 大于等于4变为0// 改变挡位(比较值)if(Speed == 0){Compare = 0;}if(Speed == 1){Compare = 40; // 太小会导致电压太小不足以驱动电机}if(Speed == 2){Compare = 60;}if(Speed == 3){Compare = 100;}}Nixie_show(1,Speed);}
}// 中断函数
void Timer0_Routine() interrupt 1
{ TL0 = 0xA4; //设置定时初始值TH0 = 0xFF; //设置定时初始值Counter++;// 设置周期if(Counter>=100){Counter = 0;} // 与比较值进行比较if(Counter<Compare){Motor = 1; // 给电}else{Motor = 0; // 不给电}
}
补充:本案例使用的按键、数码管都不是采用定时器扫描,数码管只需要静态显示不用消影操作