【FPGA+DSP系列】------(2)DSP最小核心板进行ADC采样实验(采集电位器输出电压)
前言
本来想DSP的第二篇写一下关于EPWM的实验,但是可能是手上的板子有问题,问题是上电后DSP芯片严重发烫,且排查不出来原因,又因为资源受限,示波器还不在旁边,所以没法验证EPWM脉冲的波形,所以直接换成ADC实验,ADC实验也是东拼西凑,找了一个模块,这个模块上有一个电位器,就拿这个电位器的输出当作adc采样的输入,凑活使用吧,一个是熟悉一下DSP的ADC的配置流程,另一个熟悉一下DEBUG的相关操作。
板子上电后芯片就发烫,仿真器也是返厂维修过,buff叠满了,准备自己买一套DSP的板子再,还需要买个逻辑分析仪,后面调试iic/uart/spi以及can等通信的时候能方便一点。
一、ADC采样准备
ADC参数描述
DSP实验用到的芯片是28335芯片,其中数据手册中关于ADC的相关描述如图所示,可以得到以下的信息。
首先这个adc是12位宽,模拟输入0-3V,数字量对应0-4095,步进0.73mv。
ADC时钟在25Mhz的情况,采样率12.5Mhz,转换2个周期。
16个通道
公式:V=(input_AV-ADCLO)*3/4096
ADC寄存器描述
如下表,ADC所有寄存器的功能还有地址都在下表。具体用程序进行说明吧~
触发方式
二、代码解释
ADC.h声明
ADC采样CLK 设置为25Mhz,系统CLK150Mhz
3分频 ADC_MODCLK HSPCLK = SYSCLKOUT/(2ADC_MODCLK)
150/23=25
c
#ifndef ADC_H_
#define ADC_H_
#include "DSP2833x_Device.h" // DSP2833x 头文件
#include "DSP2833x_Examples.h" // DSP2833x 例子相关头文件
#define ADC_MODCLK 3
#define ADC_CKPS 0x1 // ADC module clock = HSPCLK/2*ADC_CKPS = 25.0MHz/(1*2) = 12.5MHz
#define ADC_SHCLK 0xf // S/H width in ADC module periods = 16 ADC clocks
void ADC_Init(void);
Uint16 Read_ADCValue(void);
#endif /* ADC_H_ */
ADC.c
c
#include "adc.h"
void ADC_Init(void)
{
// Specific clock setting for this example:
EALLOW;
SysCtrlRegs.PCLKCR0.bit.ADCENCLK = 1; // ADC 使能 ADC 外设时钟及设置 ADC 工作时钟
EDIS;
// Specific clock setting for this example:
EALLOW;
//系统时钟 150M 不能直接供 ADC 工作时钟使用,需分频后才行
SysCtrlRegs.HISPCP.all = ADC_MODCLK; // HSPCLK = SYSCLKOUT/(2*ADC_MODCLK)
EDIS;
InitAdc(); // For this example, init the ADC
// Specific ADC setup for this example:
AdcRegs.ADCTRL1.bit.ACQ_PS = ADC_SHCLK; //顺序采样方式
AdcRegs.ADCTRL3.bit.ADCCLKPS = ADC_CKPS; // ADC 工作 25M 下不分频
AdcRegs.ADCTRL1.bit.SEQ_CASC = 1; // 1 Cascaded mode 1 通道模式
AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x0; // A0 为采样通道
AdcRegs.ADCTRL1.bit.CONT_RUN = 1; // Setup continuous run 连续采样模式
AdcRegs.ADCMAXCONV.bit.MAX_CONV1 = 0x0; //最大采样通道数 只用到A0
// Start SEQ1
AdcRegs.ADCTRL2.all = 0x2000; //触发方式 软件触发
}
Uint16 Read_ADCValue(void)
{
while (AdcRegs.ADCST.bit.INT_SEQ1== 0);//查询转换是否结束
AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1;//清除中断标志位
return AdcRegs.ADCRESULT0>>4;//将转换结果返回出去
//ADC 转换后的数据存储在结果寄存器内,只需读取相应的结果寄存器即可,并且有效数据是高 12 位,所以读取后的值要将低 4 位移除
}
main.c代码解释
c
/*
* main.c
*
* Created on: 2025年9月26日
* Author: DELL
*/
#include "DSP2833x_Device.h"
#include "DSP2833x_Examples.h"
#include "adc.h"
float adc_vol;
void main(void)
{
InitSysCtrl();
ADC_Init();
while(1)
{
adc_vol=(float)Read_ADCValue()*3.0/4095;
}
}
三.实验测试
平台搭建

DEBUG界面
把想看的变量添加到观看窗口,然后运行debug,通过旋转电位器,可以看到不同种类的电压的变化。
实验结果
0V的情况
1V的情况
3V的情况,这个为什么差距挺大呢,主要是因为adc采集范围是0-3V,而我的电位器供电是3.3V,所以会有误差,但是整体趋势是对的就可以。
总结
本文介绍了在DSP最小核心板上进行ADC采样实验的过程。由于EPWM实验遇到硬件问题(芯片发烫),作者改为使用电位器输出电压作为ADC采样输入。实验基于28335芯片,其ADC为12位分辨率(0-3V对应0-4095),采样率12.5MHz。文章详细说明了ADC寄存器配置和触发方式,并提供了完整的代码实现,包括ADC初始化(设置时钟分频、采样模式等)和采样值读取函数。该实验既帮助熟悉DSP的ADC配置流程,也为后续调试通信接口(I2C/UART/SPI/CAN等)做准备。