- //--------------------------- Include ---------------------------//
- #include "..\include\led.h"
- #include "..\include\main.h"
- #include "..\include\usart.h"
- #include "..\include\adc.h"
- #include "..\fwlib\inc\stm32f4xx_gpio.h"
- //---------------------------- Define ---------------------------//
- //-------------------------- Variable ---------------------------//
- //--------------------- Function Prototype ----------------------//
- //--------------------------- Function --------------------------//
- /*
- * Name : main
- * Description : ---
- * Author : ysloveivy.
- *
- * History
- * --------------------
- * Rev : 0.00
- * Date : 11/21/2015
- *
- * create.
- * --------------------
- */
- int main(void)
- {
- int i;
- //初始化
- led.initialize();
- LED_RED_ON;
- usart4.initialize(115200);
- adc.initialize();
- usart4.printf("\x0c"); //清屏
- usart4.printf("\033[1;32;40m"); //设置终端字体为绿色
- usart4.printf("\r\n\r\nhello! I am iCore3!\r\n\r\n\r\n");
- while(1){
- for(i = 0;i < 10000000;i++);
- //ADC 监控电源
- for(i = 0;i < 5;i++){
- adc.read(i);
- }
- //打印系统供电电压,
- usart4.printf(" [V] %4.2fV, ",adc.value[0] * 6);
- usart4.printf("[I] %3.0fmA , ",adc.value[1] / 2* 1000.);
- usart4.printf("[1.2V] %4.2fV, ",adc.value[2]);
- usart4.printf("[3.3V] %4.2fV, ",adc.value[3] * 2);
- usart4.printf("[2.5V] %4.2fV\r",adc.value[4] * 2);
- }
- }
2.ADC参数配置
- /*
- * Name : initialize
- * Description : ---
- * Author : ysloveivy.
- *
- * History
- * --------------------
- * Rev : 0.00
- * Date : 11/21/2015
- *
- * create.
- * --------------------
- */
- static int initialize(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- ADC_CommonInitTypeDef ADC_CommonInitStructure;
- ADC_InitTypeDef ADC_InitStructure;
- RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC,ENABLE);
- RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF,ENABLE);
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); //使能ADC1时钟
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC3, ENABLE); //使能ADC3时钟
- //ADC1_PC4<----->通道14, ADC1_PC5<----->通� �15
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN; //模拟输入
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
- GPIO_Init(GPIOC, &GPIO_InitStructure);
- //ADC3_PF5<----->通道15, ADC3_PF6<----->通道4, ADC3_PF7<----->通道5
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN; //模拟输入
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
- GPIO_Init(GPIOF, &GPIO_InitStructure);
- ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent; //ADC为独立模式
- ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles; //设置两个采样阶段之间的延迟周期数为5个周期
- ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled; //禁止DMA
- ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div6; //设置分频系数为6分频
- ADC_CommonInit(&ADC_CommonInitStructure); //初始化ADC
- ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b; //ADC转换分辨率12位
- ADC_InitStructure.ADC_ScanConvMode = DISABLE; //非扫描模式
- ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; //关闭连续转换模式
- ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None; //禁止触发检测
- ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //右对齐方式
- ADC_InitStructure.ADC_NbrOfConversion = 1; //1个转换在规则序列中
- ADC_Init(ADC1, &ADC_InitStructure);
- ADC_Init(ADC3, &ADC_InitStructure); //使能ADC
- ADC_Cmd(ADC1, ENABLE);
- ADC_Cmd(ADC3, ENABLE);
- return 0;
- }
- /*
- * Name : sort
- * Description : ---
- * Author : XiaomaGee.
- *
- * History
- * ----------------------
- * Rev : 0.00
- * Date : 11/21/2015
- *
- * create.
- * ----------------------
- */
- void sort(unsigned short int a[], int n)
- {
- int i, j, t;
- //元素从小到大排列
- for (i = 0; i < n - 1; i++) {
- for (j = 0; j < n - i - 1; j++) {
- if (a[j] > a[j + 1]) {
- t = a[j];
- a[j] = a[j + 1];
- a[j + 1] = t;
- }
- }
- }
- }
- /*
- * Name : read_adc
- * Description : ---
- * Author : ysloveivy.
- *
- * History
- * ----------------------
- * Rev : 0.00
- * Date : 11/21/2015
- *
- * create.
- * ----------------------
- */
- static int read_adc(int channel)
- {
- int i,k;
- unsigned long int temp[20] = {0};
- unsigned long int value;
- unsigned short int data[100];
- unsigned char channel_remap[5] = {ADC_Channel_14,ADC_Channel_15,ADC_Channel_15,ADC_Channel_4,ADC_Channel_5};
- //取得到的100个转换值的中间20个的平均值作为结果
- //连续取20次这样的平均值,再求平均值作为最终结果
- for(k = 0;k < 20;k++){
- for(i = 0;i < 100;i++){
- if(channel == 0 || channel == 1){
- ADC_RegularChannelConfig(ADC1, channel_remap[channel], 1, ADC_SampleTime_480Cycles); //ADC1规则通道为通道14,15,一个序列,采样时间为480个周期
- ADC_SoftwareStartConv(ADC1); //使能指定的ADC1的软件转换启动功能
- while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)); //等待转换结束
- data[i] = ADC_GetConversionValue(ADC1); //将结果保存
- }else {
- ADC_RegularChannelConfig(ADC3, channel_remap[channel], 1, ADC_SampleTime_480Cycles); //ADC3规则通道为通道15,4,5,一个序列,采样时间为480个周期
- ADC_SoftwareStartConv(ADC3);
- while(!ADC_GetFlagStatus(ADC3,
- ADC_FLAG_EOC));
- data[i] = ADC_GetConversionValue(ADC3);
- }
- }
- sort(data,100);
- for(i = 40;i < 60;i++){
- temp[k] += data[i];
- }
- temp[k] = temp[k] / 20;
- }
- value = 0;
- for(k = 0;k < 20;k++){
- value += temp[k];
- }
- value /= 20;
- adc.value[channel] = value * ADC_REF / 4096;
- return value;
- }
3.ADC参数配置说明
- typedef struct
- {
- uint32_t ADC_Mode;
- uint32_t ADC_Prescaler;
- uint32_t ADC_DMAAccessMode;
- uint32_t ADC_TwoSamplingDelay;
- }ADC_CommonInitTypeDeftypedef ;
- typedef struct
- {
- uint32_t ADC_Resolution;
- FunctionalState ADC_ScanConvMode;
- FunctionalState ADC_ContinuousConvMode;
- uint32_t ADC_ExternalTrigConvEdge;
- uint32_t ADC_ExternalTrigConv;
- uint32_t ADC_DataAlign;
- uint8_t ADC_NbrOfConversion;
- }ADC_InitTypeDef;;
ADC_Mode:工作模式, 分为独立模式和混合模式,混合模式中包含了多种工作模式。
ADC_Prescaler: 分频值, 用于配置ADC时钟,有2、4、6、8四种分频方式。
ADC_DMAAccessMode:DMX通道模式,分为:不使能、模式1、模式2、模式3。
ADC_TwoSamplingDelay:两个采样之间的延迟周期。
ADC_Resolution:分辨率,12、10、8、6位可设置。
FunctionalState ADC_ScanConvMode:用于是否开启转换模式。
FunctionalState ADC_ContinuousConvMode: 用于是否开启连续转换模式。
ADC_ExternalTrigConvEdge: 用来设置启动规则转换组转换的外部事件。
ADC_ExternalTrigConv: 色孩子数据触发检测。
ADC_DataAlign: 用于设置数据对齐方式是左对齐还是右对齐。
ADC_NbrOfConversion:用来设置规则序列的长度 。
五、实验现象
iCore3 双核心板红色 LED 常亮, 串口一直向终端输出电源监控的数据。
图9_3实验效果图
六、代码包下载
网盘:http://pan.baidu.com/s/1o7wSE06