【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等)做准备。

相关推荐
ALINX技术博客2 小时前
【FPGA 开发分享】如何在 Vivado 中使用 PLL IP 核生成多路时钟
网络协议·tcp/ip·fpga开发
XINVRY-FPGA3 小时前
XA7A75T-1FGG484Q 赛灵思 Xilinx AMD Artix-7 XA 系列 FPGA
嵌入式硬件·fpga开发·车载系统·云计算·硬件架构·硬件工程·fpga
XINVRY-FPGA5 小时前
XC7A100T-2CSG324I 赛灵思 Xilinx AMD Artix-7 FPGA
arm开发·嵌入式硬件·fpga开发·硬件工程·信号处理·dsp开发·fpga
szxinmai主板定制专家6 小时前
ZYNQ 平台下的四声道超声流量计设计与实现
运维·arm开发·人工智能·分布式·fpga开发
凌盛羽1 天前
将Gowin高云FPGA仿真库导入Modelsim中并编译
单片机·fpga开发·仿真·modelsim·gowin
云澈ovo1 天前
AI算力加速的硬件选型指南:GPU/TPU/FPGA在创意工作流中的性能对比
人工智能·fpga开发
风已经起了1 天前
FPGA学习笔记——图像锐化之Sobel算子
图像处理·笔记·学习·fpga开发·fpga
156082072191 天前
多相DDC数据FIR抽取滤波实例
fpga开发
li星野1 天前
打工人日报#20250927
fpga开发