本帖最后由 Intelligence 于 2020-11-11 13:54 编辑
我的主程序是这样写的,
#include "adc.h"
#include "gpio.h"
/*实现功能:3个指示灯显示,
30V下指示灯均亮,调到80%熄灭1个指示灯,
调到60%再熄灭1个指示灯,40%以此类推……
/*****************************************/
/*****************************************/
/*****************************************/
static uint32_t u32AdcResultAcc;
/*****************************************/
/*****************************************/
/*****************************************/
uint16_t Get_Adc_Average(uint8_t ch,uint8_t times)
{
uint32_t temp_val=0;
uint8_t t;
for(t=0;t<times;t++)
{
temp_val+=u32AdcResultAcc;
delay1ms(5);
}
return temp_val/times;
}
/*****************************************/
/*****************************************/
/*****************************************/
int32_t main(void)
{
int16_t adcx;
float temp;
stc_adc_cfg_t stcAdcCfg;
stc_adc_cont_cfg_t stcAdcContCfg;
DDL_ZERO_STRUCT(stcAdcCfg);
DDL_ZERO_STRUCT(stcAdcContCfg);
Clk_SwitchTo(ClkRCL);
Clk_SetRCHFreq(ClkFreq24Mhz);
Clk_SwitchTo(ClkRCH);
Clk_SetPeripheralGate(ClkPeripheralGpio, TRUE); //GPIO 外设时钟使能
if (Ok != Clk_SetPeripheralGate(ClkPeripheralAdcBgr, TRUE)) //ADCBGR 外设时钟使能
{
return Error;
}
Gpio_SetAnalog(2, 6, TRUE);
Adc_Enable();
M0P_BGR->CR_f.BGR_EN = 0x1u; //BGR使能
M0P_BGR->CR_f.TS_EN = 0x1u; //内置温度传感器使能
delay100us(1);
stcAdcCfg.enAdcOpMode = AdcContMode; //连续采样模式
stcAdcCfg.enAdcClkSel = AdcClkSysTDiv1; //PCLK
stcAdcCfg.enAdcSampTimeSel = AdcSampTime12Clk; //12个采样时钟
stcAdcCfg.enAdcRefVolSel = RefVolSelAVDD; //参考电压:AVDD
stcAdcCfg.bAdcInBufEn = FALSE; //电压跟随器如果使能,SPS采样速率 <=200K
stcAdcCfg.enAdcTrig0Sel = AdcTrigDisable; //ADC转换自动触发设置
stcAdcCfg.enAdcTrig1Sel = AdcTrigDisable;
Adc_Init(&stcAdcCfg);
stcAdcContCfg.enAdcContModeCh = AdcExInputCH1; //通道1 P26
stcAdcContCfg.u8AdcSampCnt = 0xf9u; //连续累加次数
stcAdcContCfg.bAdcResultAccEn = TRUE; //累加使能
Adc_ConfigContMode(&stcAdcCfg, &stcAdcContCfg);
/*****************************************/
/*****************************************/
/*****************************************/
//GPIO控制输出程序
//初始化外部GPIO 选择输出、上拉、开漏,3个端口连接LED灯
Gpio_InitIOExt(1, 4, GpioDirOut, FALSE, FALSE, FALSE, TRUE);
Gpio_InitIOExt(1, 5, GpioDirOut, FALSE, FALSE, FALSE, TRUE);
Gpio_InitIOExt(2, 3, GpioDirOut, FALSE, FALSE, FALSE, TRUE);
/*****************************************/
/*****************************************/
/*****************************************/
//输出低电平,3个LED灯全亮
Gpio_SetIO(1, 4, FALSE);
Gpio_SetIO(1, 5, FALSE);
Gpio_SetIO(2, 3, FALSE);
while (1)
{
Adc_Start();//ADC开始转换
adcx=Get_Adc_Average(AdcExInputCH1,10);
u32AdcResultAcc=(float)adcx*(3.3/4096);
u32AdcResultAcc-=adcx;
u32AdcResultAcc*=1000;
adcx=u32AdcResultAcc;
if(adcx<=3000 && TRUE != M0P_ADC->IFR_f.CONT_INTF) //等待转换完成
{
Gpio_SetIO(1, 4, TRUE);//输出高电平,熄灭1个LED亮(24v状态=调低百分之20)
delay1ms(1000);
Gpio_SetIO(1, 4, FALSE);
/*****************************************/
/*****************************************/
/*****************************************/
M0P_ADC->ICLR_f.CONT_INTC = 0; //清除转换完成标志位
Adc_GetAccResult(&u32AdcResultAcc);//获取累加采样值
Adc_ClrAccResult();//清零累加采样值
delay1ms(1000);
}
else if(u32AdcResultAcc <=2500 && FALSE != M0P_ADC->IFR_f.CONT_INTF) //等待转换完成
{
Gpio_SetIO(1, 5, TRUE);//输出高电平,熄灭2个LED亮(18v状态=调低百分之20)
/*****************************************/
/*****************************************/
/*****************************************/
M0P_ADC->ICLR_f.CONT_INTC = 0; //清除转换完成标志位
Adc_GetAccResult(&u32AdcResultAcc);//获取累加采样值
Adc_ClrAccResult();//清零累加采样值
delay1ms(1000);
}
else if(u32AdcResultAcc <=2000 && FALSE != M0P_ADC->IFR_f.CONT_INTF) //等待转换完成
{
Gpio_SetIO(2, 3, TRUE);//输出高电平,熄灭3个LED亮(12v状态=调低百分之20)
/*****************************************/
/*****************************************/
/*****************************************/
M0P_ADC->ICLR_f.CONT_INTC = 0; //清除转换完成标志位
Adc_GetAccResult(&u32AdcResultAcc);//获取累加采样值
Adc_ClrAccResult();//清零累加采样值
delay1ms(1000);
}
}
} |