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"
/*-----------------------<ADC相关函数>-------------------------------------------------------------------------*/
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的电机驱动系列回顾:
(一):CCS文件夹的建立与IQmath导入
(二):FOC文件的建立与开环代码编写
(三):EPWM配置
(四):EQEP配置与SPI主机配置
(五):ADC配置