simulink代码生成(二)——ADC采样模块

本文详细介绍了如何在C2000库中使用F28335ADC模块进行采样,包括Simulink中的设置步骤,如ADC采样单元的选择、转换模式、启动方式、采样时间和数据类型。重点讲解了ADC采样启动的ePWM触发方法。还涉及了ADC时钟配置以优化性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这一节梳理如何使用C2000库中的ADC模块,从而实现采样;基础的DSP28335的硬件知识请参照:

F28335 ADC学习过程_28335 adc采样例程-CSDN博客

F28335 ADC配置代码模块及其排序方式介绍_adcregs.adctrl1.bit.acq_ps=adc_shclk-CSDN博客

先预留几个问题,逐步进行解决。

(1)在simulink中C2000的ADC采样模块设置是怎么样的?各个选项卡代表什么?

(2)ADC采样是如何被启动的?

(3)ADC采样回来的值是什么值?是浮点数还是12位AD代表的4096?

(4)ADC的时钟怎么配置?

1 ADC采样模块的设置

在库中搜索ADC采样模块,添加到模型中,其模块如下图所示:

双击后设置面板(1)如下图所示:

(1)Module采样单元

该选项指定要使用的DSP模块:

A——显示模块A中的ADC通道(ADCINA0到ADCINA7)。

B——显示模块B中的ADC通道(ADCINB0到ADCINB7)。

A和B——显示模块A和B中的ADC通道(ADCINA0到ADCINA7和ADCINB0到ADCINB7)。

(2)Conversion mode 转换模式选择

用于信号的采样类型:

Sequential— 顺序采样:0-7或者0-15都是同一时间只转换一路信号 

simultaneous ——同步采样:0-7的一个通道和9-15的一个通道同时转换信号,但是必须要有相同的偏移量,比如ADCINA4和ADCINB4就可以,但是ADCINA7和ADCINB6就不能同一时刻转换

具体的可以参照我以前的ADC底层的博客;

F28335 ADC配置代码模块及其排序方式介绍-CSDN博客

(3)Start of conversion 启动转换的方式

触发转换开始的信号类型:

Software  ——来自软件的信号。转换值在每个采样时间更新。

ePWM#A/ePWM#B/ePWM#A_ePWM#B——  转换的开始由用户定义的PWM事件控制。(必须配合ePWM模块同时使用,并且ePWM模块需要输出触发的事件

XINT2_ADCSOC —— 转换的开始由XINT2_ADDCSOC外部信号引脚控制。

(4)Sample time 采样时间

设置ADC采样时间。这是从结果寄存器中读取值的速率。

当选择该项为-1时,为异步模式;
值得注意的是:如果想要为不同组的ADC通道设置不同的采样时间,必须向模型中添加单独的ADC块,并为每个块设置所需的采样时间。

(5)Data type 输出的数据类型

设置输出数据的类型,可以被设置的类为 autodoublesingleint8uint8int16uint16int32, or uint32

对于DSP28335,其内置的ADC采样是12位的,但是实际数据是无符号16位的即uint16,在单片机编程时需要左移4位后再进行使用;simulink代码生成时会自动处理;

双击后设置面板(2)如下图所示,这个部分就比较简单,设置需要转换的通道数,并且配置第一个第二个或者更多对应的采样管脚;

值得注意的是:在过采样模式中,给定ADC通道处的信号可以在单个转换序列期间被采样多次。若要过采样,请为多个转换指定同一通道。转换后的样本将作为单个向量输出。也就是把多个通道配置为一个引脚;

还可以使用多个输出端口,如果使用多个ADC通道进行转换,则可以为每个输出使用单独的端口,并在块上显示输出端口。如果使用多个通道而不使用多个输出端口,则数据将以单个矢量输出。

2  ADC采样是如何被启动的?

这个点需要被重点关注,软件启动和外部触发启动都比较好理解,但是这种一般不常用,电机控制中最常用的还是ePWM模块的事情触发ADC采样,例如在载波的顶点或者在载波的0点;这个需要配合ePWM模块中的事件触发使用,这里提前先设置一下ePWM模块有关的地方,

如下图所示,则配置的是CTR = PRD即载波的顶点时输出事件,勾选Enable ADC start of conversion for module A 后即可在每次CTR = PRD时进行采样;一般选择在载波顶点采样,因此此时电压矢量为零矢量,采样所得电流基本为基波电流;

3 ADC采样回来的值是什么值?是浮点数还是12位AD代表的4096?

按照上面的阐述以及文件的说明,DSP28335,其内置的ADC采样是12位的,但是实际数据是无符号16位的即uint16,在单片机编程时需要左移4位后再进行使用;simulink代码生成时会自动处理;但是我觉得还是值得测试一下的;搭建一个这样的模型;设置ePWM1的TRPD = 8192。

假如确实采样模块的输出是以4096为最大值的12位无符号数,那么可以得到一个可预想的结果:假如供电电压是1.65V左右的值,那么此时输出应该是2048左右的值。如下所示,示波器的就不放了,CMPA已经与采样值同步了。

那么就得出结论,simulink代码生成中ADC输出的值即为12位ADC采样后结果寄存器中的值,并且已经完成了左移4位的操作;即 0 - 0 , 1.65 - 2048 , 3.3 - 3096 

上面仅为1路采样结果,配置3路后;结果如下所示;

4 ADC的时钟配置

ADC模块的时钟结构如下图所示,其时钟源是高速时钟HSPCLK,经过ADCLKPS进行第一级别分频,经过CPS进行第二级分频,最终生成ADCCLK = HSPCLK/(ADCLKPS*2)/(CPS+1)。一般HSPCLK的频率为150MHz,建议进行6分频使得ADC工作在其最大时钟频率即 25MHz。

具体的环境配置如下图所示:

附录:模型截图即设置截图

在STM32F4上使用ADC采样测试纹波的过程可以分为以下几个步骤: 1. 配置ADC模块:使用STM32F4的CubeMX工具或手动编写代码配置ADC模块,设置采样分辨率、采样时间、转换模式等参数。 2. 连接信号源:将待测试的纹波信号连接到STM32F4的ADC输入引脚上。 3. 采样:启动ADC转换并等待采样完成。可以采用轮询方式或者中断方式进行采样。 4. 处理数据:将采样得到的原始数据进行处理,例如计算均值、标准差、最大值、最小值等统计量,或者进行频域分析和滤波处理。 下面是一个简单的示例代码,用于采样测试纹波: ```c #include "stm32f4xx.h" #define ADC_CHANNEL 0 // ADC采样通道 #define SAMPLE_SIZE 1000 // 采样点数 uint16_t adc_data[SAMPLE_SIZE]; // 采样数据缓存 void adc_init(void) { ADC_InitTypeDef adc_init; GPIO_InitTypeDef gpio_init; // 1. 配置GPIO引脚为模拟输入模式 gpio_init.Pin = GPIO_PIN_0; gpio_init.Mode = GPIO_MODE_ANALOG; HAL_GPIO_Init(GPIOA, &gpio_init); // 2. 配置ADC模块 __HAL_RCC_ADC1_CLK_ENABLE(); adc_init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV2; adc_init.Resolution = ADC_RESOLUTION_12B; adc_init.ScanConvMode = DISABLE; adc_init.ContinuousConvMode = ENABLE; adc_init.DiscontinuousConvMode = DISABLE; adc_init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; adc_init.ExternalTrigConv = ADC_EXTERNALTRIGCONV_T1_CC1; adc_init.DataAlign = ADC_DATAALIGN_RIGHT; adc_init.NbrOfConversion = 1; HAL_ADC_Init(&adc_init); // 3. 配置ADC采样通道 ADC_ChannelConfTypeDef adc_channel; adc_channel.Channel = ADC_CHANNEL_0; adc_channel.Rank = 1; adc_channel.SamplingTime = ADC_SAMPLETIME_3CYCLES; HAL_ADC_ConfigChannel(&adc_channel); } void adc_sample(void) { uint32_t i; // 1. 启动ADC采样 HAL_ADC_Start(&hadc1); // 2. 等待采样完成 for (i = 0; i < SAMPLE_SIZE; i++) { while (__HAL_ADC_GET_FLAG(&hadc1, ADC_FLAG_EOC) == RESET); adc_data[i] = HAL_ADC_GetValue(&hadc1); } // 3. 停止ADC采样 HAL_ADC_Stop(&hadc1); } int main(void) { // 初始化ADC模块 adc_init(); // 采样纹波信号 adc_sample(); // 处理采样数据,例如计算均值、标准差、最大值、最小值等统计量, // 或者进行频域分析和滤波处理。 while (1); } ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值