这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 活动中心 » 板卡试用 » TI280039计算正弦信号RMS(ADC+DMA)

共1条 1/1 1 跳转至

TI280039计算正弦信号RMS(ADC+DMA)

菜鸟
2025-12-03 20:00:05     打赏

一、功能概述

我使用TI C2000系列TMS320F280039C DSP实现正弦信号有效值(RMS)测量,核心外设包括ADC模块和DMA控制器以及ePWM用作ADC对高频正弦信号采样的触发源。系统采用信号发生器产生测试信号,DMA自动搬运数据,CPU高效计算RMS值。

RMS计算思路:

RMS (时域采样点) :程序中实现为

Vrms_time = sqrt(mean(s2.^2)); % 按定义:sqrt(平均平方)

对应数学表达式为image.png

image.pngimage.png

DMA在本次实验中的主要功能是直接存储器存取 (DMA) 控制器在实时数据处理应用中定期为 ADC 提供服务。通过使用 DMA 移动数据,CPU 将节省指令周期,以便将这些周期用于其他重要任务。具体而言,我们将使用信号发生器产生被测波形,并以选定的采样率对其进行采样。

二、硬件平台

TI280039C主控芯片最小系统板,编译器调试器CCS12,信号发生器,示波器。

接下来我将详细展开CCS中ADC、DMA、ePWM等外设的具体配置方法,以及调试验证过程。

1、ePWM配置

ePWM将用于以指定速率在 ADC 上触发 SOC,这里我的被测信号频率为40kHz(如下图)希望这个40kHz的信号每个周期当中采取30点用于计算RMS。

 image.png

将使用 ADC 以 1.2MHz 的速率从 myEPWM1A 对生成的信号波形进行采样。

Time Base Period = 100M/1.2M - 1;

分频系数选择一分频,最后这里大约取值82,计数模式选择向上计数。

展开“EPWM Time Base”下拉菜单,然后应用下面圈出的更改。

image.png

展开“EPWM Event-Trigger”下拉菜单,然后应用下面圈出的更改。

image.png

2、配置ADC

在 SysConfig 屏幕中,点击 ADC 旁边的“+”以添加 ADC。确保进行下面圈出的更改。如果您的器件 SYSCLK 不是 100MHz,则需要更改 ADC 时钟预分频器才能获得相同的结果。

对于“SOC0 Sample Window[SYSCLK counts]”参数,由于各器件的 SYSCLK 频率不同,同一个值可能会在不同器件上导致不同的“SOC0 Sample Time[ns]”结果。确保生成的“SOC0 Sample Time[ns]”值约为 80ns。

image.png

使用 asysctl 参数设置模拟基准电压。

如果已添加 ADC 模块,则在 ANALOG 组中选择 ASYSCTL,并将模拟基准电压更改为 1.65V 的内部电压。否则,请通过点击 ANALOG 组中的“+”来添加 ASYSCTL,然后添加 1.65V 的内部基准。

 image.png

3、配置DMA

配置过程中将使用两个地址,即源地址和目标地址。我们将配置 DMA 通道 1 的触发器和模式。DMA 通道 1 的触发器设置为来自 EPWM2SOCA,旨在向 DMA 发出信号,告知程序新的样本已经准备好,可以用于计算或者滤波了。

image.png

这里我采用的是连续模式,注意传输字大小应该设置为16位。

关于单次传输其实还有一个小技巧,可以在DMA传输中断程序中调整。

例如:本次采样完成并且由DMA成功搬运至预设好的缓存Buf当中,此时可以禁用DMA传输。这样有一个好处是在我们的DMA中断程序中,可以不用担心来不及处理完本次传输数据而又被新的数据所覆盖。

关于原始地址与目的地址的配置如下:

image.png

这段代码是在中断函数内计算有效值,本实验只做理论验证不考虑项目设计。


interrupt void dma_Ch1ISR(void)
{
    // Clear the interrupt flags.
    Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP7);
    DMA_disableTrigger(myDMA0_BASE);  // 禁用传输
    GPIO_writePin(myGPIO1,1);
    rt_OneStep(rtMPtr);
        GPIO_writePin(myGPIO1,0);
        RMS_Vol_1 = CalcRMS(AdcBufRaw);   // 计算有效值
    RMS_Vol_2 = CalcRMS(&AdcBufRaw[30]);
}

DMA传输开启时机任意,只要保证在本次数据处理完成之后开启即可。

4、debug查看原始波形

现在我们将使用 AdcBuf 实时查看采样的 PWM 波形。点击 Tools → Graph → Single Time。

Acquisition Buffer Size:30

Dsp Data Type:16 位无符号整数

Sampling Rate Hz:1200000

Start Address:AdcBufRaw

Time Display Unit:us

image.png

将其他设置保留为默认值。点击 OK,然后您应该会看到绘图窗口打开。

image.png

   可以看到基本把信号发生器产生的波形给还原出来了,实际波形用示波器观察如下:

f2035663-11df-4430-b7f4-cb1d4a031df1.jpg

并且可以看到绿色信号的频率是进入DMA中断的频率。

5、计算RMS

   附上源代码

float CalcRMS(uint16_t *buf)
{
    float sum_squares = 0;
    uint16_t *pBuf = buf;
    int i;
    for(i = 0; i < ADC_BUF_LEN; i++) {
        float real_vol = (*pBuf) / 4095.0 * 2.5 - 1; //2.5是参考电压
        sum_squares += real_vol * real_vol;
        pBuf++;
    }
    float mean_square = sum_squares / ADC_BUF_LEN;
    float Vrms_iq = sqrt(mean_square);
    return Vrms_iq;
}





关键词: TI     DSP     280039     ADC     DMA     RMS    

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]