文章目录[隐藏]
书中该节讲述的电路通过ADC芯片将电位器的阻值转换为电压量,然后使用单片机输出PWM进行电路控制。本电路也可扩展应用至需要模拟量输入与输出的场合。
目录
一、系统设计思路
书中使用的系统方案如图1-1所示:
图1-1 系统方案框图
系统使用了电位器->ADC采集电路->单片机PWM输出->电机驱动电路的方案。使用电位器的模拟量作为输入,用使用ADC芯片将之转换为数字信号,用ADC芯片采集后控制产生PWM波,最后使用电机驱动电路驱动电机工作。
二、各模块电路分析
模块电路如图2-1所示
图2-1 整体电路图
2.1电路构成
电路比较简单,由单片机、ADC芯片与电动机驱动电路构成。
51单片机的P1端口引脚与ADC芯片输出端相连,用于采集数字化后的模拟量。采集后再由P3.7引脚输出PWM波。由于仿真软件没有电位器和可调电阻这样的器件,所以书中使用了一个恒压源代替电位器做模拟输入。
驱动电路部分,书中使用了两级NPN三极管驱动电机。
2.2工作状态分析
电路工作是数据流向如下:
1、电位器调节产生的电压输入到ADC芯片的IN0端口
2、ADC采集芯片将模拟量转换为数字量并在OUT端输出
3、单片机采集转换后的数字信号
4、单片机根据数字信号产生PWM波,控制电机旋转
三、程序分析
3.1 变量定义
#include <reg51.h>
#include <stdio.h>
sbit EOC = P2^6;
sbit START = P2^5;
sbit OE = P2^7;
sbit CLK = P2^4;
sbit PWM = P3^7;
unsigned char ad_data;
图3-1 程序头文件及变量定义
程序的变量定义如图3-1所示。程序使用ad_data存储采样后的值;sbit(位定义)配置的变量,名称和电路图中一致。此处不做赘述。
3.2 延时程序
void delay_ms(unsigned int z)
{
unsigned int x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--)
{
;
}
}
图3-2 延时函数
延时子函数如图3-2所示。51单片机每12个时钟周期为一个机器周期,每10个时钟震荡为一个时钟周期。
对于书中采用的12M晶振,有1机器周期=12时钟周期=120时钟震荡;即1机器周期为1us。
C:0x0019 D3 SETB C
C:0x001A EF MOV A,R7
C:0x001B 9400 SUBB A,#0x00
C:0x001D EE MOV A,R6
C:0x001E 9400 SUBB A,#0x00
C:0x0020 4014 JC C:0036
C:0x0022 7D6E MOV R5,#0x6E
C:0x0024 7C00 MOV R4,#0x00
C:0x0026 ED MOV A,R5
C:0x0027 1D DEC R5
C:0x0028 7001 JNZ C:002B
C:0x002A 1C DEC R4
C:0x002B ED MOV A,R5
C:0x002C 4C ORL A,R4
C:0x002D 70F7 JNZ C:0026
C:0x002F EF MOV A,R7
C:0x0030 1F DEC R7
C:0x0031 7001 JNZ C:0034
C:0x0033 1E DEC R6
C:0x0034 80E3 SJMP delay_ms(C:0019)
C:0x0036 22 RET
图3-3 延时函数的汇编代码
反汇编程序如图3-3所示。其中SETB置位指令耗时1机器周期;MOV指令在有寄存器Rn或累加器A参与时耗时1周期,含有立即数时耗时两周期;SUBB减法指令耗时1周期;DEC减1指令耗时1周期条件跳转指令JC和JNE均耗时2周期;位或运算指令ORL耗时2周期;SJUM跳转指令耗费2周期;此外调用程序时的LCALL和返回时的RET指令各耗费2周期。
故可算出延时函数最内层循环总共占用了单片机的周期数,即0x0026~0x0024地址程序的执行一次占用的周期数为9周期,循环110次即为990周期,再加上外层for循环必定执行的两次带立即数的MOV,一次使用寄存器的MOV,一次DEC自减指令,一次ORL或指令,一次条件跳转JNZ,共占用了9周期。和预期延时1ms基本一致。
3.3 ADC0809采集程序
void ADC0809()
{
OE = 0;
START = 0;
START = 1;
START = 0;
delay_ms(1);
while(!EOC);
OE = 1;
ad_data = P1;
OE = 0;
}
图3-4 ADC0809采集程序
采集程序相对简单。给START(P2^5)一个正脉冲后延时1ms,等待EOC(end-of-conversion)的转换完毕(此时EOC由芯片内部电路置1),随后将输出使能OE置1,将P1输入存入8位变量ad_data,最后将输出使能置0,完成采集。
3.4 主程序
void main(void)
{
// Write your code here
EA = 1;
TMOD=0x02;
TH0 = 216;
TL0 = 216;
TR0 = 1;
ET0 = 1;
while (1)
{
ADC0809();
PWM = 1;
delay_ms(ad_data);
PWM = 0;
delay_ms(255-ad_data);
}
}
图3-5 主程序
主程序循环读取ADC采样值,根据采样值模拟出PWM波。显然程序的PWM频率较低。
3.5 模拟时钟
void t0() interrupt 1 using 0
{
CLK = ~CLK;
}
图3-6 时钟模拟程序
本电路使用单片机的管脚P2^4作为ADC芯片时钟信号输入,时钟模拟电路在每次timmer0中断执行时给CLK变量取反,即翻转P2^4的输出。
四、电路仿真结果
电路仿真结果如图4-1到图4-4四图,可知电位器产生的电压确能控制程序PWM波(若周老师书中的PWM是使用定时器产生,频率将会更高,控制性能也会更好)。
图4-1 500mV电压模拟输出结果
图4-2 1V电压模拟输出结果
图4-3 3V电压模拟输出结果
图4-4 5V电压模拟输出结果
五、番外
5.1 关于此电路
此电路是典型的使用模拟量输入控制数字量(PWM)输出的电路实例。虽然现在已经很少见到51单片机作为实际使用,现在的芯片也基本都可以直接使用管脚进行AD采样,但本电路仍十分具有代表意义。
5.2 ADC0809与逐次渐进式AD采样方法
ADC0809芯片是一款8位逐次逼近式模数转换器,8位意为其采样分辨率为2^8次方,即分辨率是256
图5-1 ADC0809说明
逐次渐进式AD采样方法如图5-1所示。逐次渐进式比较电路共有256个内部电阻,内部数字开关由SAR(successive approximation register)逐次逼近寄存器控制。当电压变化时,SAR控制内部电路开关,利用电阻的分压完成模/数转换。
图中Figure 4和5分别是A/D转换曲线和A/D绝对精度曲线,读者可在数据手册中找到详细介绍,此处不做赘述。
参考资料
[1] 周润景,谢亚楠.常用控制电路设计及应用[M].北京:电子工业出版社,2017:9
[2] ADC0808/ADC0809 8-Bit μP Compatible A/D Converters with 8-Channel Multiplexer[M].Texas Instruments,SNAS535H–OCTOBER 1999–REVISED MARCH 2013:9
版权声明:本文为CSDN博主「迷之凯旋」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/geng6614/article/details/122144527
书中该节讲述的电路通过ADC芯片将电位器的阻值转换为电压量,然后使用单片机输出PWM进行电路控制。本电路也可扩展应用至需要模拟量输入与输出的场合。
目录
一、系统设计思路
书中使用的系统方案如图1-1所示:
图1-1 系统方案框图
系统使用了电位器->ADC采集电路->单片机PWM输出->电机驱动电路的方案。使用电位器的模拟量作为输入,用使用ADC芯片将之转换为数字信号,用ADC芯片采集后控制产生PWM波,最后使用电机驱动电路驱动电机工作。
二、各模块电路分析
模块电路如图2-1所示
图2-1 整体电路图
2.1电路构成
电路比较简单,由单片机、ADC芯片与电动机驱动电路构成。
51单片机的P1端口引脚与ADC芯片输出端相连,用于采集数字化后的模拟量。采集后再由P3.7引脚输出PWM波。由于仿真软件没有电位器和可调电阻这样的器件,所以书中使用了一个恒压源代替电位器做模拟输入。
驱动电路部分,书中使用了两级NPN三极管驱动电机。
2.2工作状态分析
电路工作是数据流向如下:
1、电位器调节产生的电压输入到ADC芯片的IN0端口
2、ADC采集芯片将模拟量转换为数字量并在OUT端输出
3、单片机采集转换后的数字信号
4、单片机根据数字信号产生PWM波,控制电机旋转
三、程序分析
3.1 变量定义
#include <reg51.h>
#include <stdio.h>
sbit EOC = P2^6;
sbit START = P2^5;
sbit OE = P2^7;
sbit CLK = P2^4;
sbit PWM = P3^7;
unsigned char ad_data;
图3-1 程序头文件及变量定义
程序的变量定义如图3-1所示。程序使用ad_data存储采样后的值;sbit(位定义)配置的变量,名称和电路图中一致。此处不做赘述。
3.2 延时程序
void delay_ms(unsigned int z)
{
unsigned int x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--)
{
;
}
}
图3-2 延时函数
延时子函数如图3-2所示。51单片机每12个时钟周期为一个机器周期,每10个时钟震荡为一个时钟周期。
对于书中采用的12M晶振,有1机器周期=12时钟周期=120时钟震荡;即1机器周期为1us。
C:0x0019 D3 SETB C
C:0x001A EF MOV A,R7
C:0x001B 9400 SUBB A,#0x00
C:0x001D EE MOV A,R6
C:0x001E 9400 SUBB A,#0x00
C:0x0020 4014 JC C:0036
C:0x0022 7D6E MOV R5,#0x6E
C:0x0024 7C00 MOV R4,#0x00
C:0x0026 ED MOV A,R5
C:0x0027 1D DEC R5
C:0x0028 7001 JNZ C:002B
C:0x002A 1C DEC R4
C:0x002B ED MOV A,R5
C:0x002C 4C ORL A,R4
C:0x002D 70F7 JNZ C:0026
C:0x002F EF MOV A,R7
C:0x0030 1F DEC R7
C:0x0031 7001 JNZ C:0034
C:0x0033 1E DEC R6
C:0x0034 80E3 SJMP delay_ms(C:0019)
C:0x0036 22 RET
图3-3 延时函数的汇编代码
反汇编程序如图3-3所示。其中SETB置位指令耗时1机器周期;MOV指令在有寄存器Rn或累加器A参与时耗时1周期,含有立即数时耗时两周期;SUBB减法指令耗时1周期;DEC减1指令耗时1周期条件跳转指令JC和JNE均耗时2周期;位或运算指令ORL耗时2周期;SJUM跳转指令耗费2周期;此外调用程序时的LCALL和返回时的RET指令各耗费2周期。
故可算出延时函数最内层循环总共占用了单片机的周期数,即0x0026~0x0024地址程序的执行一次占用的周期数为9周期,循环110次即为990周期,再加上外层for循环必定执行的两次带立即数的MOV,一次使用寄存器的MOV,一次DEC自减指令,一次ORL或指令,一次条件跳转JNZ,共占用了9周期。和预期延时1ms基本一致。
3.3 ADC0809采集程序
void ADC0809()
{
OE = 0;
START = 0;
START = 1;
START = 0;
delay_ms(1);
while(!EOC);
OE = 1;
ad_data = P1;
OE = 0;
}
图3-4 ADC0809采集程序
采集程序相对简单。给START(P2^5)一个正脉冲后延时1ms,等待EOC(end-of-conversion)的转换完毕(此时EOC由芯片内部电路置1),随后将输出使能OE置1,将P1输入存入8位变量ad_data,最后将输出使能置0,完成采集。
3.4 主程序
void main(void)
{
// Write your code here
EA = 1;
TMOD=0x02;
TH0 = 216;
TL0 = 216;
TR0 = 1;
ET0 = 1;
while (1)
{
ADC0809();
PWM = 1;
delay_ms(ad_data);
PWM = 0;
delay_ms(255-ad_data);
}
}
图3-5 主程序
主程序循环读取ADC采样值,根据采样值模拟出PWM波。显然程序的PWM频率较低。
3.5 模拟时钟
void t0() interrupt 1 using 0
{
CLK = ~CLK;
}
图3-6 时钟模拟程序
本电路使用单片机的管脚P2^4作为ADC芯片时钟信号输入,时钟模拟电路在每次timmer0中断执行时给CLK变量取反,即翻转P2^4的输出。
四、电路仿真结果
电路仿真结果如图4-1到图4-4四图,可知电位器产生的电压确能控制程序PWM波(若周老师书中的PWM是使用定时器产生,频率将会更高,控制性能也会更好)。
图4-1 500mV电压模拟输出结果
图4-2 1V电压模拟输出结果
图4-3 3V电压模拟输出结果
图4-4 5V电压模拟输出结果
五、番外
5.1 关于此电路
此电路是典型的使用模拟量输入控制数字量(PWM)输出的电路实例。虽然现在已经很少见到51单片机作为实际使用,现在的芯片也基本都可以直接使用管脚进行AD采样,但本电路仍十分具有代表意义。
5.2 ADC0809与逐次渐进式AD采样方法
ADC0809芯片是一款8位逐次逼近式模数转换器,8位意为其采样分辨率为2^8次方,即分辨率是256
图5-1 ADC0809说明
逐次渐进式AD采样方法如图5-1所示。逐次渐进式比较电路共有256个内部电阻,内部数字开关由SAR(successive approximation register)逐次逼近寄存器控制。当电压变化时,SAR控制内部电路开关,利用电阻的分压完成模/数转换。
图中Figure 4和5分别是A/D转换曲线和A/D绝对精度曲线,读者可在数据手册中找到详细介绍,此处不做赘述。
参考资料
[1] 周润景,谢亚楠.常用控制电路设计及应用[M].北京:电子工业出版社,2017:9
[2] ADC0808/ADC0809 8-Bit μP Compatible A/D Converters with 8-Channel Multiplexer[M].Texas Instruments,SNAS535H–OCTOBER 1999–REVISED MARCH 2013:9
版权声明:本文为CSDN博主「迷之凯旋」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/geng6614/article/details/122144527
暂无评论