10DSP学习-利用syscfg配置ADC,并使用EPWM触发转换
(很开心,虽然没有什么阅读量,但是竟然有粉丝催更,希望对初学者有一定的帮助呀)
在之前的博客中,更新了GPIO DAC EPWM SCI等外设,还有ADC没有更新,ADC是闭环控制的重要一环。今天这篇博客就来介绍如何使用syscfg配置ADC。
0 了解ADC
在进行ADC采样之前,需要首先了解一下ADC,网上有很多资料,当然大家也可以参考F28379D的数据手册。本篇博客不做详细介绍,主要介绍如何使用syscfg来配置ADC,并在配置的过程中,简单地介绍ADC。
首先打开syscfg文件,在ANALOG的ADC部分,有关于ADC介绍的相关资源,大家可以进行了解。
1 使用syscfg配置ADC
1.1 添加一个ADC配置
点击“ADD”添加
1.2 定义ADC的名称
在Name栏里修改名称为 myADCA,本例中选用ADCA作为示例。在②处,可以看出,F28379D共有4个ADC,分别为ADC A、B、C、D。
1.3 配置ADC 时钟分频
根据提示F28379D的ADC的最大时钟频率为50MHz
查看数据手册可知,ADC的时钟直接由系统时钟提供,如下图所示
在syscfg的Clock Tree中可以查到F28379D的系统时钟为200MHz,如下图所示
因此,需要将时钟四分频
1.4 配置ADC分辨率模式( Resolution Mode)及信号模式(Signal Mode)
F28379D的ADC可以配置成,双端16位,也可以配置成单端12位。本例中以单端12位为例,如下图所示。
在LAUNCHXL-F28379D的开发板中,VREFLO是直接接地的,VREFHI接3V电压基准,因此测量电压即相对地的电压,且最高不超过VREFHI=3V。
1.5 配置SOC0(Start-of-conversions)
SOC主要配置转换,即将ADC端口的模拟量转换成数字量的一个信号。当接收到一个trigger信号,则开始转换。
1.5.1 配置SOC通道
每个SOC有16个通道,每个通道对应哪一路pin是可以自由设置的。本例中,只使能两个通道的SOC。如下图所示。
1.5.2 配置SOC通道对应的pin
以SOC0为例,这里选择Channel为single-ended ADCIN2。即选择单端输入的ADC A2作为 ADCA 的SOC0通道的pin。 下面的Channel Name和 Device Pin是不可修改的,与Channel是一一对应的。
1.5.3 配置SOC的触发源
从下图可以看出,SOC的触发源有多种,定时触发、外部触发、EPWM触发等。本例中选择使用EPWM触发,在前面的博客中介绍了如何配置EPWM。
选择触发源为ePWM1,ADCSOCA,如下图所示。
不设置SOC0的中断触发,如下图所示。
1.5.4 配置采样时间
从下图可以看出,采样窗口至少需要15个SYSCLK counts。
因此设置Sample Window为15,相应的采样时间为75ns,如下图所示
1.6 配置SOC1
与配置SOC方法一致,选择ADCA4为作为SOC1的pin。如下图所示。
1.7 检查ePWM配置
因为设置了SOC的触发源为EPWM1A SOC所以需要检查相应的 ADC SOC Trigger是否正确设置。如下图所示。
1.8 其他配置
本篇博客以实现ADC的基本功能为目的。例如ADC中断在本例中并不需要,一般任务都在定时中断中完成。此外Burst模式也用不到,这里不做赘述。
1.9 保存编译
1.9.1 观察Board_init()函数
在Board_init()函数中多了ADC_init()函数,该函数即对应上面的配置。
ADC_init()函数对ADCA进行了初始化,调用了myADCA_init()函数,具体的配置代码参考之前的配置过程进行解读
1.9.2 解读myADCA_init()
例如下图就是对两个通道的SOC0 SOC1进行了配置,TI也贴心地准备了注释。
以上便完成了ADC的配置。
2 使用ADC采样
2.1 在adc.h中找到需要用的代码
在myADCA_init()函数中,选择一个函数Open Declaration,即可跳转至adc.h文件,下图以选择ADC_setupSOC()函数为例。
2.2 学习ADC_readResult()函数
在adc.h中找到ADC_readResult()函数,该函数有两个入口参数
一个是resultBase,即result的基准地址,我们使用的是ADCA,因此resultBase即为myADCA_RESULT_BASE 也可以是 ADCA_RESULT_BASE,在board.h中重新定义了。第二个入口参数是SOC Number 我们使用了SOC0 和SOC1,在board.h中也有定义,分别是myADCA_SOC0和myADCA_SOC1,如下图所示
接下来我们只需要在main.c中调用该函数即可。
3 功能验证
本例中实现的功能是,在EPWM中断中,利用ADC采样DAC生成的波形,经过计算后,将三角波转换为0~1之间的值,并乘2,通过SCI串口发送。(算是把之前的功能串起来了)
3.1 Talk is cheap, Show me the code
中断服务函数代码
__interrupt void INT_myEPWM1_ISR(void)
{
// Verifying the ISR
EPwm1TimerIntCount++;
// 你的代码
if (EPwm1TimerIntCount%1000 ==0)
{
UserCount ++;
}
DAC_Count = DAC_Count+50.0*T;
if(DAC_Count > 1.0)
{
DAC_Count-= (1.0);
}
DAC_setShadowValue(myDAC_A_BASE,(DAC_Count*4096));
EPWM_setCounterCompareValue(myEPWM8_PWMDAC_BASE, EPWM_COUNTER_COMPARE_A, (DAC_Count*1562));
EPWM_setCounterCompareValue(myEPWM8_PWMDAC_BASE, EPWM_COUNTER_COMPARE_B, ((1.0-DAC_Count)*1562));
// ADC读取采样结果
Result0 = ADC_readResult(myADCA_RESULT_BASE,myADCA_SOC0)/4096.0;// 将采样结果转换为0~1
Result1 = ADC_readResult(myADCA_RESULT_BASE,myADCA_SOC1)/4096.0;// 将采样结果转换为0~1
SinResult0 = 2*Result0;// 将采样结果*2
SquareResult1 = 2*Result1;// 将采样结果*2
// 结束中断函数
//
// Clear INT flag for this timer
//
EPWM_clearEventTriggerInterruptFlag(myEPWM1_BASE);
//
// Acknowledge the interrupt
//
Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP3);
}
3.2 接线
接线方式如下图所示
3.3 结果
下图所示为相应的结果。(PWM-DAC输出的波形突然还是有些毛刺的呀~不过不影响本篇博客的结果)
从下图可以看出,玫红色的为采样得到的增锯齿波对应PWM-DAC1,绿色为采样的结果并将其×2。蓝色的为采样得到的减锯齿波对应PWM-DAC2,黄色为采样的结果并将其×2。
以上便完成了ADC的配置和使用!我是ManTou,希望对你有所帮助!
如果你是跟我一起做的话,可能会遇到RAM中内存不够的情况,如下图所示
可以看到RAMGS3和RAMGS4确实满了,如下图所示。
增加text的大小,增加一个RAMGS5,如下图所示,再次编译就通过了。
需要注意的是
(1) 本例中选择ADCA2 和ADCA4 的目的是告诉大家,SOC0 不是必须对应 ADCA0,即SOC的顺序不一定与ADC通道顺序保持一致。
(2) SOC的触发源是可以独立配置的,在本例中,希望两个SOC同时触发,这样就不用设置多个触发源
原文地址:https://blog.csdn.net/qq_40678163/article/details/143605444
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!