一. DSP5509A片内ADC简介
DSP内部的ADC转换速率比较低, 采样频率21.5kHz,所以只能采样一些频率较低的信号。DSP5509A内部集成10位连续逼近模式模/数转换器.
//文档: 5509 DSP Analog-to-Digital Converter (ADC) Reference Guide.pdf
根据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 转换时钟 ))
二. 相关寄存器
15位是ADC转换开始位:0,无效; 1,开始
14~12位是模拟通道选择:000~011分别选择AIN0~AIN3,100~111表示所有通道关闭。
15位是ADC转换标志位:0,采样数据已存在;1,正在转换中
14~12位是ADC数据选择通道:同上寄存器
11~10是保留未:0
9~0位:存放10位ADC转换结果
15~8位:0~255,采样和保持时间 分频字段
7~4位:保留
3~0位:0000~1111转换时钟分频字段
15~9位保留
8位是ADC的Idle(低功耗)使能位:0,ADC不能进入Idle状态;1,ADC进入Idle状态,时钟停止
7~0位是CPUCLKDIV:0~255,系统时钟分频字段
三. 使用例子
使用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
",samplestoraage[0]);
printf("samplestoraage[1]:%d
",samplestoraage[1]);
CSL_init();
ADC_setFreq(sysclkdiv,convratediv,sampletimediv);
ADC_read(channel,samplestoraage,samplenumber);
printf("ADCDATA:%d
",ADCDATA);
printf("samplestoraage[0]:%d
",samplestoraage[0]);
printf("samplestoraage[1]:%d
",samplestoraage[1]);
printf("
====================
");
}
====================
samplestoraage[0]:0
samplestoraage[1]:0
ADCDATA:4608
samplestoraage[0]:512
samplestoraage[1]:512
====================
PS:通道对应芯片的引脚,我的芯片只有AIN0,和AIN1. 为什么没AIN2,AIN3?