好久时间没有写博文了,今天终于有点空,来写一篇吧。今天我们来写AD模组及其使用。
PSOC3内置的模组是∑-Δ模数转换器,是目前应用比较广泛的一种AD转换器。在讲PSOC系统的∑-Δ模数转换器之前我们先来补习一些AD的基本知识。
一、什么是ADC?
ADC,Analog-to-Digital
Converter的缩写,指模/数转换器或者模拟/数字转换器。真实世界的模拟信号,例如温度、压力、声音或者图像等,需要转换成更容易储存、处理和发射的数字形式。模/数转换器可以实现这个功能,在各种不同的产品中都可以找到它的身影。
模拟信号转换成数字信号的器件
二、ADC的几个关键参数
1.基准电压Vref--------(转换器的满刻度电压)
2. 位数(n)---ADC输出的二进制位数,n越大,分辨率就越高
3. 分辨率:表示输出数字量变化一个最低有效位所对呀的输入模拟电压的变化量,其大小为:
>
4.量化误差:由于分辨率的关系造成真实值与转换值之间的误差
5.转换精度:是实际的ADC与理想的ADC相比的转换误差
6.转换时间:ADC完成一次AD转换所需的时间,转换时间与转换速率成倒数关系
三、ADC输出数字量与输入模拟量之间的关系
设输入模拟电压为Vin,基准电压为Vref
,转换后的数字量为D,ADC的位数为n,这几个参数之间的关系为:
>
所以:由上式我们可以看出,一个ADC的输出量与参考电压和位数有关,在设置时要注意这几点
四、∑-Δ模数转换器
Σ一△模数转换器是一种高度集成化的新型模数转换器。采用过采样技术,无需采样一保持电路 ,其主要特性有:
(1)可以配置的转换位数(8-20位可选)
(2)11中可选的模拟电压输入范围 (分单极性4中和差分输入两种情况)
(3)采样率10 SPS到384 ksps
(4)4中工作模式
(5) 可配置的输入缓存放大电路
实例,用PSOC3做一个0-3.3v的数字电压表
1.新建一个项目,命名为PSOC3-AD,打开原理图,放置一个ADC,一个LCD,如果是多路输入信号的话,还可以放置一个A-Mux(多路模拟开关),一个定时器,如图:
>
配置如图
>
编写如下代码:
/* ========================================
*
* Copyright YOUR COMPANY, THE YEAR
* All Rights Reserved
* UNPUBLISHED, LICENSED SOFTWARE.
*
* CONFIDENTIAL AND PROPRIETARY INFORMATION
* WHICH IS THE PROPERTY OF your company.
*
* ========================================
*/
#include
uint16 AD_Resulit = 0;
uint16 Channel = 0;
float C_to_V = 0.0;
uint8 Flag = 0;
#define ROW_0 0 /* LCD
row 0 */
#define COLUMN_0 0 /* LCD column 0 */
#define COLUMN_9 9 /* LCD column 9 */
#define COLUMN_10 10 /* LCD column 10 */
#define COLUMN_11 11 /* LCD column 11 */
/* For clearing Tens and Hundreds place */
#define CLEAR_TENS_HUNDREDS " "
/* For clearing Hundreds place */
#define CLEAR_HUNDREDS "
"
void UpdateDisplay (float voltageRawCount,uint16 Channel);
void main()
{
ADC_Start();/*启动AD*/
LCD_Char_1_Start();
Timer_1_Start();
isr_Timer1_Start();
AMux_1_Start();
ADC_Init(); /* 初始化AD */
ADC_Enable(); /*ADC使能*/
ADC_StartConvert(); /*AD开始转换*/
LCD_Char_1_Position(ROW_0,COLUMN_0); /*移动光标到(0,0)处 */
LCD_Char_1_PrintString("V Count: ");
AMux_1_Select(Channel);
CYGlobalIntEnable;
for(;;)
{
if(Flag == 0)
{
Timer_1_Stop() ;
if(ADC_IsEndConversion() ==
ADC_RETURN_STATUS) /* 判断转换是否结束. */
{
AD_Resulit = ADC_GetResult16();
C_to_V = ADC_CountsTo_Volts(AD_Resulit);
UpdateDisplay(C_to_V, Channel);
Flag = 1;
Timer_1_Start();
Channel++;
if (Channel == 4)
Channel = 0;
AMux_1_Select(Channel);
}
}
}
}
void UpdateDisplay (float voltageRawCount,uint16 Channel)
{
int
Integer,Decimal;
/*定义两个变量分别存整数部分和小数部分*/
Integer = (int) voltageRawCount;
Decimal = (int) ((voltageRawCount -
Integer)*1000)+1; /*分别取出小数部分和小数部分,保留3位小数*1000,两位*100*/
LCD_Char_1_Position(ROW_0,COLUMN_9); /*
移动光标到(0,9) */
LCD_Char_1_PrintNumber(Integer); /* 输出整数部分 */
LCD_Char_1_PrintString(".");
/* 输出小数点*/
LCD_Char_1_PrintNumber(Decimal); /*输出小数部分*/
LCD_Char_1_Position(1,0);
LCD_Char_1_PrintString("Channel: ");
LCD_Char_1_PrintNumber(Channel);
}
连接硬件,观看工作效果