- /*******************************************************************************************************
- 文件名称:ADC驱动
- 编写版本:V0.1
- 编写日期:2012.10.25
- ********************************************************************************************************/
- #include "ADC.h"
- char adcRunFlag=0;
- void AD_GPIO(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- //RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD, ENABLE);
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
- GPIO_Init(GPIOA, &GPIO_InitStructure);
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
- GPIO_Init(GPIOB, &GPIO_InitStructure);
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
- GPIO_Init(GPIOC, &GPIO_InitStructure);
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PB9输出
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_Init(GPIOB, &GPIO_InitStructure);
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1; //PE0,1输出
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_Init(GPIOE, &GPIO_InitStructure);
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PD7扩展板之舵机部分
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOD, &GPIO_InitStructure);
- //所有其他悬空IO口设为下拉输入
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14; //PA14
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOA, &GPIO_InitStructure);
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9; //PB8,9
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOB, &GPIO_InitStructure);
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_14 | GPIO_Pin_15;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PC10,14,15
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOC, &GPIO_InitStructure);
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PD0~7
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOD, &GPIO_InitStructure);
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1; //PE0,1
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOE, &GPIO_InitStructure);
- }
- void AD_Init(void)
- {
- AD_GPIO();
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
- RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC, DISABLE);
- /* ADC1 configuration ------------------------------------------------------*/
- 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_Init(ADC1, &ADC_InitStructure);
- /* Enable ADC1 */
- ADC_Cmd(ADC1, ENABLE);
- /* Enable ADC1 reset calibaration register */
- ADC_ResetCalibration(ADC1);
- /* Check the end of ADC1 reset calibration register */
- while(ADC_GetResetCalibrationStatus(ADC1));
- /* Start ADC1 calibaration */
- ADC_StartCalibration(ADC1);
- /* Check the end of ADC1 calibration */
- while(ADC_GetCalibrationStatus(ADC1));
- /* Start ADC1 Software Conversion */
- ADC_SoftwareStartConvCmd(ADC1, ENABLE);
- difCount=3;
- ExtendPort = GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_8);
- ExtendServo = GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_7);
- }
- int AD_Get(u8 channel)
- {
- int count;
- int ADC1ConvertedValue;
- GPIO_InitTypeDef GPIO_InitStructure;
- adcRunFlag++;
- if((channel==14)&&(StateEx1))
- {
- StateEx1=0;
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
- GPIO_Init(GPIOC, &GPIO_InitStructure);
- }
- if((channel==15)&&(StateEx2))
- {
- StateEx2=0;
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
- GPIO_Init(GPIOC, &GPIO_InitStructure);
- }
- /* ADC1 regular channels configuration */
- ADC_RegularChannelConfig(ADC1, ChannelArr[channel], 1, ADC_SampleTime_71Cycles5);
- ADC_ClearFlag(ADC1, ADC_FLAG_EOC);
- ADC_Cmd(ADC1, ENABLE);
- count=0;
- while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC))
- {
- count++;
- if(count==100)
- {
- adcRunFlag=0;
- return ADCLast;
- }
- }
- ADC1ConvertedValue = ADC_GetConversionValue(ADC1);
- ADCLast=ADC1ConvertedValue;
- adcRunFlag--;
- return ADC1ConvertedValue;
- }
- int analog(u8 port) //1~12,13~20,21~28
- {
- if(port<1||port>36)
- return -1;
- else
- {
- if(port<13) //AD1-12
- {
- return AD_Get(port);
- }
- else if(port<21) //13-20没有AD功能
- {
- return -1;
- }
- else if(port<29) //AD21-28
- {
- if(ExtendPort)
- {
- //4051选择
- Select4051(port-21);
- return AD_Get(15);
- }
- else
- {
- return -1;
- }
- }
- else if(port<37) //AD29-36
- {
- if(ExtendPort)
- {
- //4051选择
- Select4051(port-29);
- return AD_Get(14);
- }
- else
- {
- return -1;
- }
- }
- else
- {
- return -1;
- }
- }
- }
- int battery(void)
- {
- return AD_Get(16);
- }
- void Select4051(u8 ch)
- {
- switch(ch)
- {
- case 0:
- Set4051A();
- Clr4051B();
- Set4051C();
- break;
- case 1:
- Set4051A();
- Set4051B();
- Set4051C();
- break;
- case 2:
- Clr4051A();
- Clr4051B();
- Set4051C();
- break;
- case 3:
- Clr4051A();
- Set4051B();
- Set4051C();
- break;
- case 4:
- Clr4051A();
- Clr4051B();
- Clr4051C();
- break;
- case 5:
- Set4051A();
- Set4051B();
- Clr4051C();
- break;
- case 6:
- Set4051A();
- Clr4051B();
- Clr4051C();
- break;
- case 7:
- Clr4051A();
- Set4051B();
- Clr4051C();
- break;
- default:
- break;
- }
- }
- void SysTick_Handler_bat_callback(void)
- {
- if(battery()<2300)
- LED_R(1);
- else
- LED_R(0);
- }
复制代码
|