从直流电机调速(PWM)到AD/DA 模数/数模转换
在上一篇文章《从DS18B20温度报警器到LCD1602液晶显示屏51单片机学习笔记》中我们学习了如何通过51单片机驱动数字温度传感器和液晶显示屏实现了温度数据的采集与显示。本篇我们将继续深入51单片机的外设应用探索直流电机DC Motor的控制与AD/DA模数/数模转换技术。通过PWM脉冲宽度调制实现电机调速并利用XPT2046芯片完成模拟信号的采集与转换为后续的智能控制系统打下坚实基础。如果觉得有收获可以为我的文章点点小赞这将激励我创作更好的内容谢谢一、直流电机1.1 直流电机介绍直流电机是一种将电能转换为机械能的装置。一般的直流电机有两个电极当电极正接时电机正转当电极反接时电机反转直流电机主要由永磁体定子、线圈转子和换向器组成除直流电机外常见的电机还有步进电机、舵机、无刷电机、空心杯电机等1.2 电机驱动电路大功率器件直接驱动H桥驱动1.3 PWM介绍PWMPulse Width Modulation即脉冲宽度调制在具有惯性的系统中可以通过对一系列脉冲的宽度进行调制来等效地获得所需要的模拟参量常应用于电机控速、开关电源等领域PWM重要参数频率 1 / TS占空比 TON/ TS精度 占空比变化步距1.4 产生PWM方法修改定时器模块Timer0Timer0.c文件↓-----------------------------#include REGX52.H /** brief 定时器0初始化100微秒11.0592Mhz param 无 retval 无 */ void Timer0_Init()//100us { TMOD0xF0; //把TMOD的低四位清零高四位保持不变 TMOD|0x01; //把TMOD的最低位置1高四位保持不变 TL00xA4; //设置定时初值 TH00xFF; //设置定时初值100us TF00; //清除TF0标志 TR01; //定时器0开始计时 ET01; EA1; PT00; }-----------------------------修改中断函数void Timer0_Routine() interrupt 1 { Counter; Counter%100; if(CounterCompare) { Motor1; } else { Motor0; } TL00xA4; //设置定时初值 TH00xFF; //设置定时初值100us }1.5 实例一15.1.1LED呼吸灯主要了解PWM占比的效果main.c文件↓-----------------------------#include REGX52.H sbit LEDP2^0; void Delay(unsigned int t) { while(t--); } void main() { unsigned char Time,i; while(1) { for(Time0;Time100;Time)//LED呼吸灯由暗变亮 { for(i0;i20;i) { LED0; Delay(Time); LED1; Delay(100-Time); } } for(Time100;Time0;Time--)//LED呼吸灯由亮变暗 { for(i0;i20;i) { LED0; Delay(Time); LED1; Delay(100-Time); } } } }-----------------------------1.6 实例二15.2.1直流电机调速main.c文件↓-----------------------------#include REGX52.H #include Delay.h #include Key.h #include Nixie.h #include Timer0.h sbit MotorP1^0; unsigned char Counter0,Compare0; unsigned char KeyNum0,Speed0; void main() { Counter0; Compare0; KeyNum0; Speed0; Motor0; Timer0_Init(); while(1) { KeyNumKey(); if(KeyNum1) { Speed; Speed%4; if(Speed0){Compare0;} if(Speed1){Compare15;} if(Speed2){Compare30;} if(Speed3){Compare40;} } Nixie(1,Speed); } } void Timer0_Routine() interrupt 1 { Counter; Counter%100; if(CounterCompare) { Motor1; } else { Motor0; } TL00xA4; //设置定时初值 TH00xFF; //设置定时初值100us }-----------------------------二、AD/DA 模数/数模转换2.1 AD/DA介绍ADAnalog to Digital模拟-数字转换将模拟信号转换为计算机可操作的数字信号DADigital to Analog数字-模拟转换将计算机输出的数字信号转换为模拟信号AD/DA转换打开了计算机与模拟信号的大门极大地提高了计算机系统的应用范围也为模拟信号数字化处理提供了可能2.2 硬件电路模型- AD转换通常有多个输入通道用多路选择开关连接至AD转换器以实现AD多路复用的目的提高硬件利用率- AD/DA与单片机数据传送可使用并口速度快、原理简单也可使用串口接线少、使用方便- 可将AD/DA模块直接集成在单片机内这样直接写入/读出寄存器就可进行AD/DA转换单片机的IO口可直接复用为AD/DA的通道2.3 硬件电路 2.4 运算放大器- 运算放大器简称“运放”是具有很高放大倍数的放大电路单元。内部集成了差分放大器、电压放大器、功率放大器三级放大电路是一个性能完备、功能强大的通用放大电路单元由于其应用十分广泛现已作为基本的电路元件出现在电路图中- 运算放大器可构成的电路有电压比较器、反相放大器、同相放大器、电压跟随器、加法器、积分器、微分器等- 运算放大器电路的分析方法虚短、虚断负反馈条件下2.5 运放电路2.6 DA原理1T型电阻网络DA转换器2PWM型DA转换器输出电压VO PWM占空比*VH2.7 AD原理2.8 AD/DA性能指标- 分辨率指AD/DA数字量的精细程度通常用位数表示。例如对于5V电源系统来说8位的AD可将5V等分为256份即数字量变化最小一个单位时模拟量变化5V/2560.01953125V所以8位AD的电压分辨率为0.01953125VAD/DA的位数越高分辨率就越高- 转换速度表示AD/DA的最大采样/建立频率通常用转换频率或者转换时间来表示对于采样/输出高速信号应注意AD/DA的转换速度2.9 AD芯片——XPT2046XPT2046是一款4线制电阻式触摸屏控制器内含12位分辨率125KHz转换速率逐步逼近型A/D转换器。XPT2046支持从1.5V到5.25V的低电压I/O接口。XPT2046能通过执行两次A/D转换查出被按的屏幕位置除此之外还可以测量加在触摸屏上的压力。内部自带2.5V参考电压可以作为辅助输入、温度测量和电池监测之用电池监测的电压范围可以从0V到6V。XPT2046片内集成有一个温度传感器。在2.7V的典型工作状态下关闭参考电压功耗可小于0.75mW。XPT2046采用微小的封装形式TSSOP-16, QFN-16和VFBGA48。工作温度范围为-40℃85℃。与ADS7846、TSC2046、AK4182A完全兼容2.10 XPT2046时序很像SPIXPT2046.h头文件↓----------------------------#ifndef __XPT2046_H__ #define __XPT2046_H__ #define XPT2046_XP_8 0x9C #define XPT2046_YP_8 0xDC #define XPT2046_VBAT_8 0xAC #define XPT2046_AUX_8 0xEC #define XPT2046_XP_12 0x94 #define XPT2046_YP_12 0xD4 #define XPT2046_VBAT_12 0xA4 #define XPT2046_AUX_12 0xE4 unsigned int XPT2046_ReadAD(unsigned char Command); #endif----------------------------XPT2046.c文件↓----------------------------#include Delay.h sbit XPT2046_CSP3^5; sbit XPT2046_DCLKP3^6; sbit XPT2046_DINP3^4; sbit XPT2046_DOUTP3^7; unsigned int XPT2046_ReadAD(unsigned char Command) { unsigned char i; unsigned int ADVAlue0; XPT2046_DCLK0; XPT2046_CS0; //写入读取数据指令 for(i0;ilt;8;i) { XPT2046_DINCommandamp;(0x80gt;gt;i);//无论第几位是1输入的数据非0即1 XPT2046_DCLK1; XPT2046_DCLK0; } //读取数据,无论8位还是12位都先读16位 for(i0;ilt;16;i) { XPT2046_DCLK1; XPT2046_DCLK0; if(XPT2046_DOUT){ADVAlue|(0x8000gt;gt;i);}//从高位到低位读根据if判断读出的数据是1还是0给ADVAlue依次赋值 } XPT2046_CS1; if(Commandamp;0x08)//8位转换分辨率 { ADVAlueADVAluegt;gt;8; } else //12位转换分辨率 { ADVAlueADVAluegt;gt;4; } return ADVAlue; }----------------------------2.11 实例一16.1.1AD模数转换ADJ电位器NTC热敏电阻RG光敏电阻main.c文件↓----------------------------#include REGX52.H #include Delay.h #include LCD1602.h #include XPT2046.h unsigned int ADValue0; void main() { LCD_Init(); LCD_ShowString(1,1,ADJ NTC RG);//ADJ电位器NTC热敏电阻RG光敏电阻 while(1) { ADValueXPT2046_ReadAD(XPT2046_XP_8); LCD_ShowNum(2,1,ADValue,3); ADValueXPT2046_ReadAD(XPT2046_YP_8); LCD_ShowNum(2,6,ADValue,3); ADValueXPT2046_ReadAD(XPT2046_VBAT_8); LCD_ShowNum(2,11,ADValue,3); Delay(10); } }----------------------------三、总结本文系统性地介绍了51单片机在直流电机控制与AD/DA转换两大核心领域的应用实践。在直流电机控制方面我们首先了解了直流电机的基本结构与工作原理掌握了通过H桥电路驱动电机正反转的方法。重点学习了PWM脉冲宽度调制技术通过调节占空比来等效控制输出电压从而实现电机的无级调速。通过LED呼吸灯和直流电机调速两个实例我们直观地感受了PWM占空比对输出效果的影响并掌握了如何通过修改定时器中断函数来生成可调占空比的PWM信号。在AD/DA转换方面我们深入探讨了模拟信号与数字信号相互转换的原理与意义。从硬件电路模型、运算放大器基础到具体的T型电阻网络DA转换器和PWM型DA转换器逐步构建了对DA转换的完整认识。随后我们重点学习了AD转换的原理与性能指标并以XPT2046这款常用的触摸屏控制芯片为例详细分析了其工作时序类似SPI通信并提供了完整的驱动代码。最后通过AD模数转换实例演示了如何采集电位器、热敏电阻和光敏电阻的模拟信号并在LCD1602上实时显示。将这两部分知识结合起来我们便能够构建一个完整的闭环控制系统通过AD转换采集环境模拟量如温度、光照经过单片机处理再通过PWM控制直流电机如风扇、泵的转速从而实现智能调节。这为后续学习更复杂的嵌入式系统与物联网应用奠定了基本的硬件基础。都看到这了点点赞吧