打印

PSOC3 ADC模组使用实例

[复制链接]
1801|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
teabottle|  楼主 | 2014-8-31 15:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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) 可配置的输入缓存放大电路
沙发
teabottle|  楼主 | 2014-8-31 15:12 | 只看该作者
编写如下代码:



/* ========================================
*
* 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);

}

使用特权

评论回复
板凳
xiaxingxing| | 2015-10-25 22:27 | 只看该作者

psoc 5 CY8CKIT-050开发板,

t1=ADC_GetResult16();
t2=ADC_CountsTo_mVolts(t1);
LCD_Position(0,0);
LCD_PrintNumber(t1);
LCD_Position(1,0);
LCD_PrintNumber(t2);
LCD显示的结果为:
255(ADC的分辨率是8位)
5089

请问,通过滑动变阻器,我的模拟输入明明是0~3.3V,为什么会得出5089mv(5.089V),而不是3300mV呢?在线等,请各位高手帮忙分析一下.

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

97

主题

1441

帖子

1

粉丝