51单片机学习笔记-4
直流电机和PWM驱动
- 直流电机:依靠PWM调速,直接连电源则全速输出;(交流电机靠变频调速)。
- 步进电机:如图,通电一个脉冲则旋转一个方向(A/B/C),靠脉冲数和脉冲方向实现对位置的控制。

此处是步进电机原理图;步进电机没有闭环,所以不能反馈监控实时速度,当电机在空载和满载时,实际转速肯定是不一致的。
-
舵机:控制转向用,它可以输出固定角度。
-
无刷电机及空心杯电机:适用高速输出场景。(伺服电机有点类似这类电机,伺服带编码器,可以依靠编码器反馈出实时位置和速度,可以做一些闭环调节算法(比如PID)来保持稳定输出,也可以监控失速情况等)。
-
电机驱动电路
- 直接驱动,不能换向。
- H桥驱动,可以实现电机自动换向。

-
呼吸灯案例,最简易的PWM应用(缺点是占用main函数运行时间,通常写在定时器里面比较合适):
#include <REGX52.H>
sbit LED=P2^0;
void DelayTime(unsigned int t) //利用while做延时(12MHZ下,机器指令跳一句1us)
{
while(t--);
}
void main()
{
unsigned char Time,i;
while(1)
{
for(Time=0;Time<100;Time++) //正循环,100是总的循环次数,相当于周期。
{
for(i=0;i<20;i++) //利用循环20次的时间来保持LED亮度,让LED的亮度变化不至于太快
{
LED=0;
DelayTime(Time);
LED=1;
DelayTime(100-Time);
}
}
for(Time=0;Time<100;Time++) //负循环
{
for(i=0;i<20;i++)
{
LED=0;
DelayTime(100-Time);
LED=1;
DelayTime(Time);
}
}
}
}
- 直流电机调速

- 控制代码:用按键控制速度变化;设置值在0..100范围内,比较计数值和设置值之间的差,用于设定占空比:
#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
}
}
//初始化定时器
#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;
}
}
*/
- PWM在应用上,输出加上低通滤波器可以实现DA转换。

U15A是运算放大器(+为同相输入端,-为反向输入端;输出端接电阻接回反向输入端可以形成深度负反馈),内部是一个集成电路(内部集成差分放大器,电压放大器,功率放大器三级放大电路)。运算放大器可以构成电压比较器,反向放大器,电压跟随器,加法器,积分器,微分器等电路。运放的分析方法一般为虚短/虚段(负反馈条件下)。
最基本的运放是一个比较器原理(同相输入和反向输入的比较结果来决定输出(理想放大系数无穷大,但是因为电源电压的限制,所以输出一般就是电源电压));其他的电路就在基本的比较电路下做拓展。
红外遥控控制基本原理
-
简介:
- 原理:利用红外光进行通信的设备,由红外LED将调制后的信号发出,再由专门的红外接收头解调输出。
- 通信方式:单工,异步。
- 红外波长:940nm(肉眼不可见)。
- 通信协议标准:NEC标准。
-
发送端电路1:
- 38KHZ为载波频率,因为自然界存在很多红外光,干扰很重,所以把需要输出的信号IN叠加在38KHZ的载波频率上,隔绝干扰(整个过程称为
信号调制)。

- 38KHZ为载波频率,因为自然界存在很多红外光,干扰很重,所以把需要输出的信号IN叠加在38KHZ的载波频率上,隔绝干扰(整个过程称为
此处三极管低电平导通
- 发送端电路2:
- 相比于发送电路1,该电路更简单,IN直接发送(38KHZ+信号)叠加后的波形信号。

- 相比于发送电路1,该电路更简单,IN直接发送(38KHZ+信号)叠加后的波形信号。
此处三极管低电平导通
-
接收电路:
- 接收电路一般集成在一个集成电路内,集成电路本身完成
解调过程,用户只需要关注输出端,即可获得发送来的信号。

- 接收电路一般集成在一个集成电路内,集成电路本身完成
-
基本发送和接收:

-
NEC编码基础:
- 信号的周期为110ms;
- Sart信号低电平9ms+高电平4.5ms;
- 逻辑0:560us低+560us高;
- 逻辑0:560us低+1690us高;
- 重复发送(长按按键时):低电平9ms+高电平2.25ms;
- 发送一个周期的数据长度为32位,(地址+地址补码+命令+命令补码)(补码的作用是校验防错);

-
示例遥控器的命令号如下:

-
信号接收方式:
- 信号接收需要以外部中断的方式接收,因为普通IO口做不到接收NEC协议这么快的信号的接收。


- 信号接收需要以外部中断的方式接收,因为普通IO口做不到接收NEC协议这么快的信号的接收。
-
NEC编码的真实波形图:
- KEY1 ~ KEY4对应遥控器的按键K1 ~ K4

- KEY1 ~ KEY4对应遥控器的按键K1 ~ K4
-
NEC编码解析:
- 最后多发送一个560us的低电平,作为结束。
- 注意看图形背后的格子,一个格子为2ms,基本时间长度可以和NEC标准定义的信号时间长度对应。


浙公网安备 33010602011771号