基于DSP280049C的正点原子PMSM电机驱动(五):ADC配置

userADC.h配置

/*
 * userADC.h
 *
 *  Created on: 2023年4月2日
 *      Author: 24460
 */

#ifndef USER_INC_USERADC_H_
#define USER_INC_USERADC_H_

void ADC_int(void);


#endif /* USER_INC_USERADC_H_ */

userADC.c配置

/*
 * userADC.c
 *
 *  Created on: 2023年4月2日
 *      Author: 24460
 */

#include "F28x_Project.h"
#include "FOC.h"
#include "userADC.h"

/*------------------------------------------------------------------------------------------------*/

void ADC_int(void)
{
//第一步:ADC时钟配置
    ADC_setPrescaler(ADCA_BASE, ADC_CLK_DIV_4_0);//ADCA四分频(ADCCLK=SYSCLK/4),25MHZ
    ADC_setPrescaler(ADCC_BASE, ADC_CLK_DIV_4_0);//ADCC四分频(ADCCLK=SYSCLK/4),25MHZ
//第二步:参考电压选择
    ADC_setVREF(ADCA_BASE, ADC_REFERENCE_INTERNAL, ADC_REFERENCE_3_3V);//内部电压3.3V
    ADC_setVREF(ADCC_BASE, ADC_REFERENCE_INTERNAL, ADC_REFERENCE_3_3V);//内部电压3.3V
//第三步:转换结束时触发中断
    ADC_setInterruptPulseMode(ADCA_BASE, ADC_PULSE_END_OF_CONV);
    ADC_setInterruptPulseMode(ADCC_BASE, ADC_PULSE_END_OF_CONV);
//第四步:启动ADC并延时1ms
    ADC_enableConverter(ADCA_BASE);
    ADC_enableConverter(ADCC_BASE);
    DEVICE_DELAY_US(1000);

//第五步:SOC配置
    ADC_setupSOC(ADCA_BASE, ADC_SOC_NUMBER0, ADC_TRIGGER_SW_ONLY,ADC_CH_ADCIN0, 9);//ADCA的SOC0对应A0通道,设置为软件触发且窗口时长为10个SYSCLK
    ADC_setupSOC(ADCA_BASE, ADC_SOC_NUMBER1, ADC_TRIGGER_SW_ONLY,ADC_CH_ADCIN1, 9);//ADCA的SOC0对应A1通道,设置为软件触发且窗口时长为10个SYSCLK
    ADC_setupSOC(ADCA_BASE, ADC_SOC_NUMBER2, ADC_TRIGGER_SW_ONLY,ADC_CH_ADCIN2, 9);//ADCA的SOC0对应A0通道,设置为软件触发且窗口时长为10个SYSCLK
    ADC_setupSOC(ADCA_BASE, ADC_SOC_NUMBER4, ADC_TRIGGER_SW_ONLY,ADC_CH_ADCIN4, 9);//ADCA的SOC0对应A1通道,设置为软件触发且窗口时长为10个SYSCLK
    ADC_setInterruptSource(ADCA_BASE, ADC_INT_NUMBER1, ADC_SOC_NUMBER0);//ADCA的SOC0对应中断INT1
    ADC_enableInterrupt(ADCA_BASE, ADC_INT_NUMBER1);
    ADC_clearInterruptStatus(ADCA_BASE, ADC_INT_NUMBER1);

    /*分离式无感驱动时用C0 C2 C4
    ADC_setupSOC(ADCC_BASE, ADC_SOC_NUMBER0, ADC_TRIGGER_SW_ONLY,ADC_CH_ADCIN0, 9);//ADCC的SOC0对应C2通道,设置为软件触发且窗口时长为10个SYSCLK
    ADC_setupSOC(ADCC_BASE, ADC_SOC_NUMBER2, ADC_TRIGGER_SW_ONLY,ADC_CH_ADCIN2, 9);//ADCC的SOC2对应C3通道,设置为软件触发且窗口时长为10个SYSCLK
    ADC_setupSOC(ADCC_BASE, ADC_SOC_NUMBER4, ADC_TRIGGER_SW_ONLY,ADC_CH_ADCIN4, 9);//ADCC的SOC4对应C4通道,设置为软件触发且窗口时长为10个SYSCLK
    ADC_setInterruptSource(ADCC_BASE, ADC_INT_NUMBER1, ADC_SOC_NUMBER0);//ADCC的SOC0对应中断INT1
    ADC_enableInterrupt(ADCC_BASE, ADC_INT_NUMBER1);
    ADC_clearInterruptStatus(ADCC_BASE, ADC_INT_NUMBER1);
*/

}

ADC读取在FOC控制函数中的应用

在FOC.h中申明要用到的部分参数

/*ADC采集及其滤波参数*/
#define K_1       0.000806          //ADC电流计算中:3.3/4096
#define K_2       1000/132         //132mv/A
#define Fc 50 //电流采样的截止频率50HZ
#define q  (pi_2*Fc*Ts)/(pi_2*Fc*Ts+1)//滤波器时间常数

在FOC.c中进行数值读取以及滤波

    /*************************电流读取部分*********************************/
    ADC_forceSOC(ADCA_BASE , ADC_SOC_NUMBER4);
    ADC_forceSOC(ADCA_BASE , ADC_SOC_NUMBER0);
    while (ADC_getInterruptStatus(ADCA_BASE, ADC_INT_NUMBER1) == false)
    {

    }
    ADC_clearInterruptStatus(ADCA_BASE, ADC_INT_NUMBER1);
    adcResult4 = ADC_readResult (ADCARESULT_BASE , ADC_SOC_NUMBER4);    //ADC_u
    adcResult0 = ADC_readResult (ADCARESULT_BASE , ADC_SOC_NUMBER0);    //ADC_v
    /*以上为ADC数值采集*/
    iu_get     = _IQmpy( _IQ(q) , _IQ(adcResult4) )  + _IQmpy( _IQ(1-q) , iu_get );
    iv_get     = _IQmpy( _IQ(q) , _IQ(adcResult0) )  + _IQmpy( _IQ(1-q) , iv_get );
    /*以上为一阶数字滤波*/
    //数据打印
    data1 = (_IQtoF(iu_get))*1;
    data2 = (_IQtoF(iv_get))*1;
    SPIA_sendtwo(data1 ,data2 );

在FOC开环情况下,读取到的UV两相电流值如图
基于DSP280049C的正点原子PMSM电机驱动(五):ADC配置_第1张图片

基于DSP280049C的电机驱动系列回顾:

(一):CCS文件夹的建立与IQmath导入
(二):FOC文件的建立与开环代码编写
(三):EPWM配置
(四):EQEP配置与SPI主机配置
(五):ADC配置

你可能感兴趣的:(DSP电机驱动系列,单片机,嵌入式硬件,dsp开发)