DSP学习笔记----片内ADC

一. DSP5509A片内ADC简介

DSP内部的ADC转换速率比较低, 采样频率21.5kHz,所以只能采样一些频率较低的信号。DSP5509A内部集成10位连续逼近模式模/数转换器.

//文档: 5509 DSP Analog-to-Digital Converter (ADC) Reference Guide.pdf

DSP学习笔记----片内ADC_第1张图片

 根据ADC的结构图,可以看见,ADC由时钟电路通道选择电路采样保持电路还有电子电容电路组成。

ADC 时钟 = (CPU Clock) / (CPUCLKDIV + 1)
ADC 转换时钟 = (ADC Clock) / (2 * (CONVRATEDIV + 1))     [must be less than or equal to 2 MHz]
ADC 采样保持时间 = (1 / (ADC Clock)) / (2  * (CONVRATEDIV + 1 + SAMPTIMEDIV))  [must be greater than or equal to 40 µs]
ADC 总转换时间 = (ADC 采样保持时间 ) + (13 * (ADC 转换时钟 ))

二. 相关寄存器

  • 控制寄存器(ADCCTL) 

 DSP学习笔记----片内ADC_第2张图片

15位是ADC转换开始位:0,无效; 1,开始

14~12位是模拟通道选择:000~011分别选择AIN0~AIN3,100~111表示所有通道关闭。

  • 数据寄存器(ADCDATA)

 DSP学习笔记----片内ADC_第3张图片

 15位是ADC转换标志位:0,采样数据已存在;1,正在转换中

14~12位是ADC数据选择通道:同上寄存器

11~10是保留未:0

9~0位:存放10位ADC转换结果

  • 时钟分频寄存器(ADCCLKDIV)

 DSP学习笔记----片内ADC_第4张图片

 DSP学习笔记----片内ADC_第5张图片

15~8位:0~255,采样和保持时间 分频字段

7~4位:保留

3~0位:0000~1111转换时钟分频字段

  • 时钟控制寄存器(ADCCLKCTL)

 DSP学习笔记----片内ADC_第6张图片

15~9位保留

8位是ADC的Idle(低功耗)使能位:0,ADC不能进入Idle状态;1,ADC进入Idle状态,时钟停止

7~0位是CPUCLKDIV:0~255,系统时钟分频字段

三. 使用例子

使用ADC需要进行两步配置:设置ADC采样时钟读数据

  • 设置ADC采样时钟

 ADC 时钟 = (CPU Clock) / (CPUCLKDIV + 1)
ADC 转换时钟 = (ADC Clock) / (2 * (CONVRATEDIV + 1))     [must be less than or equal to 2 MHz]
ADC 采样保持时间 = (1 / (ADC Clock)) / (2  * (CONVRATEDIV + 1 + SAMPTIMEDIV))  [must be greater than or equal to 40 µs]
ADC 总转换时间 = (ADC 采样保持时间 ) + (13 * (ADC 转换时钟 ))

  • 读数据操作

使用CSL函数ADC_setFreq()ADC_read()

 ADC_setFreq(sysclkdiv,convratediv,sampletimediv);设置系统时钟,转换时钟,采样保持时钟
 ADC_read(channel,samplestoraage,samplenumber);设置ADC转换通道,转存地址(可以用数组),转换后数据长度

#include
#include
#include

Uint16 samplestoraage[2]={0,0};
int sysclkdiv=2,convratediv=0,sampletimediv=79;
int counter=0,index=0;
int channel=1,samplenumber=2;
main()
{
	printf("samplestoraage[0]:%d\n",samplestoraage[0]);
	printf("samplestoraage[1]:%d\n",samplestoraage[1]);
	CSL_init();
	ADC_setFreq(sysclkdiv,convratediv,sampletimediv);
	ADC_read(channel,samplestoraage,samplenumber);
	printf("ADCDATA:%d\n",ADCDATA);
	printf("samplestoraage[0]:%d\n",samplestoraage[0]);
	printf("samplestoraage[1]:%d\n",samplestoraage[1]);
	printf("\n====================\n");
}

====================
samplestoraage[0]:0
samplestoraage[1]:0
ADCDATA:4608
samplestoraage[0]:512
samplestoraage[1]:512

====================

PS:通道对应芯片的引脚,我的芯片只有AIN0,和AIN1. 为什么没AIN2,AIN3?

你可能感兴趣的:(硬件开发)