自学内容网 自学内容网

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)!