查看: 5675|回复: 5

[8月赛] 【麒麟传说】麒麟座mini板片上ADC初探

[复制链接]

3

主题

7

帖子

24

积分

新手上路

Rank: 1

积分
24
发表于 2017-8-1 20:23:17 | 显示全部楼层 |阅读模式
本帖最后由 cs1270 于 2017-8-10 15:30 编辑

麒麟座MINI开发板采用STM32F103CB为主控芯片,采用ESP8266 WIFI模块接入ONENET平台,支持UARTIICSPICAN等下位机常用协议, 剩余IO口全部引到两边开放,可通过排针杜邦线连接,感觉非常适合外挂各种传感器,体积小且扩展性好,而且提供各种库函数,可以极大缩短开发时间,就连我这样以前连WIFI模块都没有接触过的小白上手起来也很快,好了,今天我其实要分享的是片上ADC的一点使用心得。
步入正题:
STM32F103CB自带两个12位的片上ADC,使用的步骤主要如下:
1.      初始化ADC的IO口跟时钟
初始化ADC的IO口主要初始化对应引脚为模拟输入,初始化时钟是因为ADC的转化需要时钟驱动,使用时应先使能其时钟并设置分频
GPIO_InitTypeDef GPIO_InitStructure;//按照GPIO初始化结构初始化ADC IO
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1|RCC_APB2Periph_GPIOA,ENABLE);//使能时钟           
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 ; /* 选择引脚,PA111通道*/
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOA,&GPIO_InitStructure);   /* 设定上述参数*/
printf("%s\r\n","ADC IO Assign finished");/*通过串口显示*/
RCC_ADCCLKConfig(RCC_PCLK2_Div8);/*设置ADC时钟为8分频*/
2.      初始化ADC
ADC_InitTypeDefADC_InitStructure;
ADC_InitStructure.ADC_Mode=ADC_Mode_Independent;/*独立模式*/                                         
ADC_InitStructure.ADC_ScanConvMode=DISABLE;      /*扫描模式关闭*/
ADC_InitStructure.ADC_ContinuousConvMode=DISABLE;/*连续转化模式关闭*/
ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;/*软件触发*/
ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right;/*右对齐*/
ADC_InitStructure.ADC_NbrOfChannel=1;/*通道数目*/
ADC_DeInit(ADC1);  /*初始化前先将寄存器复位*/
ADC_Init(ADC1,&ADC_InitStructure);/*按以上初始化ADC1*/
ADC_RegularChannelConfig(ADC1,ADC_Channel_1,1,ADC_SampleTime_239Cycles5);
首先定义一个初始化结构体变量,对其赋值,再利用初始化函数XX_Init()来实现对外设的初始化可以让程序可读性大大增强,对于有些外设需要初始化的东西特别多时,这种套路特别有用。ADC_Mode参数主要是指ADC1根ADC2的配合,这里只用ADC1,设置为独立工作模式;扫描模式指的是ADC1跟ADC2分别有很多通道,每个通道可以理解为一个IO口,当使能时,完成一个通道后转到下一个通道,可实现ADC在不同IO口的分时复用;连续转化模式使能时,ADC打开后只需要一次触发,不停开始转化,关闭时,每次触发只转化一次;触发模式确定ADC转换条件,设置为软件触发时,调用库函数void ADC_SoftwareStartConvCmd(ADC_TypeDef* ADCx, FunctionalStateNewState)开始转换;因为使用一个16位寄存器来存放ADC输出的12位数据,所以需要规定数据对齐方式,常用为右对齐,即低12位有效;通道数目规定使用几路通道。
调试时一定要保障所用硬件及其寄存器在初始化是可靠的复位,不然奇怪的问题层出不穷,耗费时间体力。ADC_DeInit函数提供ADC外设的可靠复位,建议加在初始化之前。
对ADC各通道的采样时间及扫描模式时转化优先级的设置通过库函数ADC_RegularChannelConfig来规定,此步最容易忘掉。
3.      打开ADC,校准ADC,
/**************************adc打开校准*********************/
ADC_Cmd(ADC1,ENABLE);            //注意ADC使能必须在ADC_ResetCalibration之前,否则会卡死在等待复位完成中
ADC_ResetCalibration(ADC1);                    //校验复位
while(ADC_GetResetCalibrationStatus(ADC1)){printf("%s\r\n","waitfor adc reset calibration finish...");}   //等待复位完成
ADC_StartCalibration(ADC1);                    //开始ADC1校准
while(ADC_GetCalibrationStatus(ADC1)==SET){printf("%s\r\n","waitfor adc calibration finish...");}  //等待校准完成


4.      在合适的地方启用转化后,就可以读数据啦
ADC_SoftwareStartConvCmd(ADC1,ENABLE);
while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)==RESET){printf("%s\r\n","waitfor adc conversion finish...");};  //等待转化完成
data=ADC_GetConversionValue(ADC1);
或者直接写成一个函数,方便调用:
uint16_tGet_ADC_Data(uint16_t Num)
{
uint16_t data;
ADC_SoftwareStartConvCmd(ADC1,ENABLE);
while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)==RESET){printf("%s\r\n","waitfor adc conversion finish...");};  //等待转化完成
data=ADC_GetConversionValue(ADC1);
printf("%s\r\n","ADCData acquired");/*通过串口显示*/
printf("%x\r\n",data);/*通过串口显示*/
return data;
}

备注:以上库函数皆来自STM32官方固件库中stm32f10x_gpio.c,stm32f10x_rcc.c,stm32f10x_adc.c文件;
以上内容已封装到adc.c文件中,可直接添加到工程中driver层后调用ADC操作函数。
下图是ADC采集不同电压数据上传到ONENET平台

另附上工程文件,该工程文件原本实现IO口LED灯状态的上传和控制,加上adc.c后将ADC1通道2对应数据上传平台


//————————————————————————————————————————————//
更新:
传上ADC1的封装函数包,可直接调用,封装中修改ADC读数据函数,多次采样,更加准确,返回值直接返回电压




ADC电压.png

OneNET_Mini_ESP8266_EDP_Led_ADC.zip

4.05 MB, 下载次数: 662

工程项目文件

STM32F103xADC1封装函数.zip

1.67 KB, 下载次数: 618

更新

回复

举报

23

主题

1078

帖子

2219

积分

版主

Rank: 7Rank: 7Rank: 7

积分
2219
发表于 2017-8-2 10:25:49 | 显示全部楼层
cs1270 发表于 2017-8-2 08:57
大板的ADC驱动论坛上有么?麒麟座开发板外设大多数字接口,例程里面没有找到ADC的=。= ...

大板有呀,下载2.4的例程,tcrt5000红外对管就是

3

主题

7

帖子

24

积分

新手上路

Rank: 1

积分
24
 楼主| 发表于 2017-8-2 08:57:20 | 显示全部楼层
152******** 发表于 2017-8-1 22:19
吧大板的ADC驱动拿过来也是可以用的哈

大板的ADC驱动论坛上有么?麒麟座开发板外设大多数字接口,例程里面没有找到ADC的=。=

23

主题

1078

帖子

2219

积分

版主

Rank: 7Rank: 7Rank: 7

积分
2219
发表于 2017-8-1 22:19:08 | 显示全部楼层
吧大板的ADC驱动拿过来也是可以用的哈

1

主题

5

帖子

11

积分

新手上路

Rank: 1

积分
11
发表于 2017-8-1 22:03:55 | 显示全部楼层
阿帅,我来抢个沙发

51

主题

161

帖子

207

积分

中级会员

Rank: 3Rank: 3

积分
207
发表于 2017-8-2 09:04:19 | 显示全部楼层
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表