一、功能概述
我使用TI C2000系列TMS320F280039C DSP实现正弦信号有效值(RMS)测量,核心外设包括ADC模块和DMA控制器以及ePWM用作ADC对高频正弦信号采样的触发源。系统采用信号发生器产生测试信号,DMA自动搬运数据,CPU高效计算RMS值。
RMS计算思路:
RMS (时域采样点) :程序中实现为
Vrms_time = sqrt(mean(s2.^2)); % 按定义:sqrt(平均平方)
对应数学表达式为


DMA在本次实验中的主要功能是直接存储器存取 (DMA) 控制器在实时数据处理应用中定期为 ADC 提供服务。通过使用 DMA 移动数据,CPU 将节省指令周期,以便将这些周期用于其他重要任务。具体而言,我们将使用信号发生器产生被测波形,并以选定的采样率对其进行采样。
二、硬件平台
TI280039C主控芯片最小系统板,编译器调试器CCS12,信号发生器,示波器。
接下来我将详细展开CCS中ADC、DMA、ePWM等外设的具体配置方法,以及调试验证过程。
1、ePWM配置
ePWM将用于以指定速率在 ADC 上触发 SOC,这里我的被测信号频率为40kHz(如下图)希望这个40kHz的信号每个周期当中采取30点用于计算RMS。

将使用 ADC 以 1.2MHz 的速率从 myEPWM1A 对生成的信号波形进行采样。
Time Base Period = 100M/1.2M - 1;
分频系数选择一分频,最后这里大约取值82,计数模式选择向上计数。
展开“EPWM Time Base”下拉菜单,然后应用下面圈出的更改。

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

2、配置ADC
在 SysConfig 屏幕中,点击 ADC 旁边的“+”以添加 ADC。确保进行下面圈出的更改。如果您的器件 SYSCLK 不是 100MHz,则需要更改 ADC 时钟预分频器才能获得相同的结果。
对于“SOC0 Sample Window[SYSCLK counts]”参数,由于各器件的 SYSCLK 频率不同,同一个值可能会在不同器件上导致不同的“SOC0 Sample Time[ns]”结果。确保生成的“SOC0 Sample Time[ns]”值约为 80ns。

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

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

这里我采用的是连续模式,注意传输字大小应该设置为16位。
关于单次传输其实还有一个小技巧,可以在DMA传输中断程序中调整。
例如:本次采样完成并且由DMA成功搬运至预设好的缓存Buf当中,此时可以禁用DMA传输。这样有一个好处是在我们的DMA中断程序中,可以不用担心来不及处理完本次传输数据而又被新的数据所覆盖。
关于原始地址与目的地址的配置如下:

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

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

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

并且可以看到绿色信号的频率是进入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;
}
我要赚赏金
