【FPGA+DSP系列】——(2)DSP最小核心板进行ADC采样实验(采集电位器输出电压)

【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/2
3=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等)做准备。

相关推荐
乌恩大侠3 小时前
【OAI】 USRP 在conf文件中的配置,RU选项
fpga开发
qq_小单车1 天前
xilinx-DNA
fpga开发·xilinx
Flamingˢ1 天前
FPGA中的嵌入式块存储器RAM:从原理到实现的完整指南
fpga开发
Flamingˢ1 天前
FPGA中的存储器模型:从IP核到ROM的深度解析与应用实例
网络协议·tcp/ip·fpga开发
FPGA小c鸡2 天前
【FPGA深度学习加速】RNN与LSTM硬件加速完全指南:从算法原理到硬件实现
rnn·深度学习·fpga开发
Aaron15882 天前
通信灵敏度计算与雷达灵敏度计算对比分析
网络·人工智能·深度学习·算法·fpga开发·信息与通信·信号处理
博览鸿蒙2 天前
IC 和 FPGA,到底区别在哪?
fpga开发
思尔芯S2C2 天前
FPGA原型验证实战:如何应对外设连接问题
fpga开发·risc-v·soc设计·prototyping·原型验证
Flamingˢ2 天前
FPGA实战:VGA成像原理、时序详解与Verilog控制器设计与验证
fpga开发
FPGA_小田老师2 天前
xilinx原语:OSERDES2(并串转换器)原语详解
fpga开发·lvds·xilinx原语·oserdese·并串转换