在适配ADC硬件时,先学习Aworks ADC编程的接口,查看Aworks提供的测试demo,才知道其导出什么样的接口供应用层使用。只要在注册ADC时,确认了其对应的通道号,编程起来就很轻松了。
1. 首先阅读原理图
在RT1052上面有两个ADC控制器,每个控制器各16个转换通道,RT1052有些引脚只能当作数字引脚,有些引脚同时支持数字引脚和模拟引脚功能
2. 设备资源及驱动适配
2.1 设备资源的注册
其设备资源均在awbl_hwconf_imx1050_adc1.h awbl_hwconf_imx1050_adc2.h注册
所以需要先确认硬件设计上对应的ADC引脚,在如下两个函数当中打开即可。
aw_local void __imx1050_adc1_plfm_init (void)
{
int i = 0;
aw_local aw_const int adc1_gpios[] = {
//GPIO1_27, /* channel 0 */
//GPIO1_12, /* channel 1 */
//GPIO1_13, /* channel 2 */
//GPIO1_14, /* channel 3 */
//GPIO1_15, /* channel 4 */
//GPIO1_16, /* channel 5 */
//GPIO1_17, /* channel 6 */
//GPIO1_18, /* channel 7 */
//GPIO1_19, /* channel 8 */
/*SWS_DET_AD*/
GPIO1_20, /* channel 9 */
/*BRAKE_DET_AD*/
GPIO1_21, /* channel 10 */
//GPIO1_22, /* channel 11 */
//GPIO1_23, /* channel 12 */
/* Reserve1_DET_AD */
GPIO1_24, /* channel 13 */
/* Reserve2_DET_AD */
GPIO1_25, /* channel 14 */
/*Reserve3_DET_AD*/
GPIO1_26, /* channel 15 */
};
if (aw_gpio_pin_request("adc1_gpios",
adc1_gpios,
AW_NELEMENTS(adc1_gpios)) == AW_OK) {
for (i = 0; i < AW_NELEMENTS(adc1_gpios); i++) {
/* ÅäÖÃADÒý½Å */
aw_gpio_pin_cfg(adc1_gpios, IMX1050_PAD_CTL(0));
}
}
aw_clk_enable(IMX1050_CLK_CG_ADC1);
};
aw_local void __imx1050_adc2_plfm_init (void)
{
int i = 0;
aw_local aw_const int adc2_gpios[] = {
/*Reserve4_DET_AD*/
GPIO1_27, /* channel 16 */
/*VDD_DET*/
GPIO1_28, /* channel 17 */
/*NTC_AD*/
GPIO1_29, /* channel 18 */
//GPIO1_30, /* channel 19 */
//GPIO1_31, /* channel 20 */
//GPIO1_16, /* channel 21 */
//GPIO1_17, /* channel 22 */
//GPIO1_18, /* channel 23 */
//GPIO1_19, /* channel 24 */
//GPIO1_20, /* channel 25 */
//GPIO1_21, /* channel 26 */
//GPIO1_22, /* channel 27 */
//GPIO1_23, /* channel 28 */
//GPIO1_24, /* channel 28 */
//GPIO1_25, /* channel 30 */
//GPIO1_26, /* channel 31 */
};
if (aw_gpio_pin_request("adc2_gpios",
adc2_gpios,
AW_NELEMENTS(adc2_gpios)) == AW_OK) {
for (i = 0; i < AW_NELEMENTS(adc2_gpios); i++) {
/* ÅäÖÃADÒý½Å */
aw_gpio_pin_cfg(adc2_gpios, IMX1050_PAD_CTL(0));
}
}
aw_clk_enable(IMX1050_CLK_CG_ADC2);
};
2.2 设备驱动的注册
在aw_prj_config.c文件当中
#ifdef AW_DRV_IMX1050_ADC
awbl_imx10xx_adc_drv_register();
#endif
2.3 设备宏开关
在aw_prj_param_auto_cfg.h文件当中,如果定义了AW_DEV_IMX1050_ADC1 AW_DEV_IMX1050_ADC2对就的宏AW_DRV_IMX1050_ADC就会被定义,ADC控制器驱动就会被注册。所以我们只需要在aw_prj_params.h中打开如下两个宏. 至此BSP适配完毕,可以通过Awork标准接口进行访问。
aw_prj_params.h
#define AW_DEV_IMX1050_ADC1 /**< brief iMX1050 ADC */
#define AW_DEV_IMX1050_ADC2 /**< brief iMX1050 ADC2 */
aw_prj_param_auto_cfg.h
/**
* name ÄÚ²¿ADC
* @{
*/
#if defined AW_DEV_IMX1050_ADC1 ||
defined AW_DEV_IMX1050_ADC2
#ifndef AW_COM_ADC
#define AW_COM_ADC
#endif
#define AW_DRV_IMX1050_ADC
#endif
/** @} */
3. 如何测式
#define ADC_TEST
#define SWS_DET_AD_CH_NUM 9
#define BRAKE_DET_AD_CH_NUM 10
#define Reserve1_DET_AD_CH_NUM 13
#define Reserve2_DET_AD_CH_NUM 14
#define Reserve3_DET_AD_CH_NUM 15
#define Reserve4_DET_AD_CH_NUM 16
#define VDD_DET_AD_CH_NUM 17
#define NTC_AD_CH_NUM 18
#define ADC_CH_NUMS 8
int ch_num_buf[ADC_CH_NUMS] = {
SWS_DET_AD_CH_NUM,
BRAKE_DET_AD_CH_NUM,
Reserve1_DET_AD_CH_NUM,
Reserve2_DET_AD_CH_NUM,
Reserve3_DET_AD_CH_NUM,
Reserve4_DET_AD_CH_NUM,
VDD_DET_AD_CH_NUM,
NTC_AD_CH_NUM,
};
char* ch_map_string[] = {
"SWS_DET_AD",
"BRAKE_DET_AD",
"Reserve1_DET_AD",
"Reserve2_DET_AD",
"Reserve3_DET_AD",
"Reserve4_DET_AD",
"VDD_DET_AD",
"NTC_AD"
};
#ifdef ADC_TEST
#define SAMPLES_NUM 5
void adc_test(){
uint16_t adc_val[SAMPLES_NUM];
uint32_t vol_val[SAMPLES_NUM];
int i;
for(i=0; i < ADC_CH_NUMS; i++){
memset(adc_val, 0, sizeof(adc_val));
memset(vol_val, 0, sizeof(vol_val));
aw_adc_sync_read(ch_num_buf, adc_val, SAMPLES_NUM, AW_FALSE);
aw_adc_val_to_mv(ch_num_buf, adc_val, SAMPLES_NUM, vol_val);
for (i = 0; i < SAMPLES_NUM; i++) {
aw_kprintf("adc channel %s, %d conversion result : %dmVn", ch_map_string, i + 1, vol_val);
}
aw_mdelay(500);
aw_kprintf("rn");
}
}
#endif
4. 总结
此次针对ADC的配置非常的简单,上层的接口简单易用。前提条件还是得学习Aworks的框架。
|
|
2022-2-28 15:39:07
评论
举报
|
|
|