飞思卡尔小车程序ad

#include "common.h"
#include "liu_adc.h"

/********************************************************************/
//AD模块初始化
/********************************************************************/
uint8_t LIU_ADC_Init(ADC_MemMapPtr adcmap,uint8_t mode, uint8_t diff){

//函数的形参貌似只用了一个

//开启ADC模块时钟
/* if (adcmap == ADC1_BASE_PTR){
SIM_SCGC6 |= (SIM_SCGC6_ADC0_MASK);//系统时钟门控制寄存器6,adc0标志位设为1
}*/
SIM_SCGC3 |= (SIM_SCGC3_ADC1_MASK );//打开AD1时钟
//else return 0;

//校准(官方校准函数)
ADC_Cal(adcmap);
//初始化ADC
//sc2
ADC_SC2_REG(adcmap) &= ~ADC_SC2_ADTRG_MASK;//软触发
//软触发(重复了,不管了) | 比较器一系列都关了 | dma使能开 | 默认用电
ADC_SC2_REG(adcmap) |= (ADTRG_SW | ACFE_DISABLED | ACFGT_LESS | ACREN_DISABLED | DMAEN_ENABLED | ADC_SC2_REFSEL(REFSEL_EXT));
//sc3
//关掉了硬件平均使能&关掉了硬件平均选择通道(有关硬件触发的都关掉,没有用的说...
ADC_SC3_REG(adcmap) &= (~ADC_SC3_AVGE_MASK & ~ADC_SC3_AVGS_MASK);
//关掉CAL(忘了是啥了),打开adc连续使能(因为是dma,不能有单次触发)
ADC_SC3_REG(adcmap) |= CAL_OFF | ADC_SC3_ADCO_MASK;
//sc1
//关掉ad中断功能(使用dma不需要),单通道模式
ADC_SC1_REG(adcmap,A) |= (AIEN_OFF | DIFF_SINGLE) ;
ADC_SC1_REG(adcmap,B) |= (AIEN_OFF | DIFF_SINGLE) ;
//关掉ad通道使能(初始化关闭,而后以此作为ad使能开关)
ADC_SC1_REG(adcmap,A) &= ~(ADC_SC1_ADCH_MASK);
//cfg1
//普通电源模式|1分频|短模式|使用系统时钟|8位输出
ADC_CFG1_REG(adcmap) |= ADLPC_NORMAL | ADC_CFG1_ADIV(ADIV_1) | ADLSMP_SHORT | ADC_CFG1_ADICLK(ADICLK_BUS_2) | ADC_CFG1_MODE(MODE_8);
//cfg2
//选择多路开关a|打开ADACKEN时钟(不过没用上)|正常速度模式| 加额外的两个周期
ADC_CFG2_REG(adcmap) |= MUXSEL_ADCA | ADACKEN_ENABLED | ADHSC_NORMAL | ADLSTS_2 ;

return 1;
}

/********************************************************************/
//使能ad函数
void LIU_ADC_SE_Get()
{


// SIM_SCGC5 |= SIM_SCGC5_PORTA_MASK;
// PORT_PCR_REG(PORTA_BASE_PTR, 4-3) = PORT_PCR_MUX(0);
ADC_SC1_REG(ADC1_BASE_PTR,A) |= ADC_SC1_ADCH(4); //软件使能通道4

}


u8 ad_once() //采集某路模拟量的AD值
{

u8 result_ad;


while (( ADC_SC1_REG(ADC1_BASE_PTR,A) & ADC_SC1_COCO_MASK ) != ADC_SC1_COCO_MASK)
{
;//等待转换完成
}

result_ad = ADC_R_REG(ADC1_BASE_PTR,A);
ADC_SC1_REG(ADC1_BASE_PTR,A) &= ~ADC_SC1_COCO_MASK; //清ADC转换完成标志
return result_ad;
}

相关文档
最新文档