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的载波频率上,隔绝干扰(整个过程称为信号调制)。

此处三极管低电平导通

  • 发送端电路2:
    • 相比于发送电路1,该电路更简单,IN直接发送(38KHZ+信号)叠加后的波形信号。

此处三极管低电平导通

  • 接收电路:

    • 接收电路一般集成在一个集成电路内,集成电路本身完成解调过程,用户只需要关注输出端,即可获得发送来的信号。
  • 基本发送和接收:

  • NEC编码基础:

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

  • 信号接收方式:

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

  • NEC编码的真实波形图:

    • KEY1 ~ KEY4对应遥控器的按键K1 ~ K4
  • NEC编码解析:

    • 最后多发送一个560us的低电平,作为结束。
    • 注意看图形背后的格子,一个格子为2ms,基本时间长度可以和NEC标准定义的信号时间长度对应。
posted @ 2025-04-07 20:12  你要去码头整点薯条吗  阅读(92)  评论(0)    收藏  举报