sensor_2026/HARDWARE/ADC/adc.c

94 lines
3.0 KiB
C
Raw Normal View History

2026-02-09 11:14:38 +08:00
#include "adc.h"
#include "delay.h"
//////////////////////////////////////////////////////////////////////////////////
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB>ѧϰʹ<CFB0>ã<EFBFBD>δ<EFBFBD><CEB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɣ<EFBFBD><C9A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>κ<EFBFBD><CEBA><EFBFBD>;
//ALIENTEK STM32F407<30><37><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//ADC <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F><><EFBFBD><EFBFBD>ԭ<EFBFBD><D4AD>@ALIENTEK
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̳:www.openedv.com
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:2014/5/6
//<2F><EFBFBD><E6B1BE>V1.0
//<2F><>Ȩ<EFBFBD><C8A8><EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ؾ<EFBFBD><D8BE><EFBFBD>
//Copyright(C) <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӿƼ<D3BF><C6BC><EFBFBD><EFBFBD>޹<EFBFBD>˾ 2014-2024
//All rights reserved
//////////////////////////////////////////////////////////////////////////////////
//<2F><>ʼ<EFBFBD><CABC>ADC
void Adc_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
ADC_CommonInitTypeDef ADC_CommonInitStructure;
ADC_InitTypeDef ADC_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//ʹ<><CAB9>GPIOAʱ<41><CAB1>
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); //ʹ<><CAB9>ADC1ʱ<31><CAB1>
//<2F>ȳ<EFBFBD>ʼ<EFBFBD><CABC>ADC1ͨ<31><CDA8>5 IO<49><4F>
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;//PA5 ͨ<><CDA8>5
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;//ģ<><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
GPIO_Init(GPIOA, &GPIO_InitStructure);//<2F><>ʼ<EFBFBD><CABC>
RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,ENABLE); //ADC1<43><31>λ
RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,DISABLE); //<2F><>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>
ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;//<2F><><EFBFBD><EFBFBD>ģʽ
ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>׶<EFBFBD>֮<EFBFBD><D6AE><EFBFBD><EFBFBD><EFBFBD>ӳ<EFBFBD>5<EFBFBD><35>ʱ<EFBFBD><CAB1>
ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled; //DMAʧ<41><CAA7>
ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div4;//Ԥ<><D4A4>Ƶ4<C6B5><34>Ƶ<EFBFBD><C6B5>ADCCLK=PCLK2/4=84/4=21Mhz,ADCʱ<43><CAB1><EFBFBD><EFBFBD><EFBFBD>ò<EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>36Mhz
ADC_CommonInit(&ADC_CommonInitStructure);//<2F><>ʼ<EFBFBD><CABC>
ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;//12λģʽ
ADC_InitStructure.ADC_ScanConvMode = DISABLE;//<2F><>ɨ<EFBFBD><C9A8>ģʽ
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;//<2F>ر<EFBFBD><D8B1><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>
ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;//<2F><>ֹ<EFBFBD><D6B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<E2A3AC><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//<2F>Ҷ<EFBFBD><D2B6><EFBFBD>
ADC_InitStructure.ADC_NbrOfConversion = 1;//1<><31>ת<EFBFBD><D7AA><EFBFBD>ڹ<EFBFBD><DAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ҳ<><D2B2><EFBFBD><EFBFBD>ֻת<D6BB><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1
ADC_Init(ADC1, &ADC_InitStructure);//ADC<44><43>ʼ<EFBFBD><CABC>
ADC_Cmd(ADC1, ENABLE);//<2F><><EFBFBD><EFBFBD>ADת<44><D7AA><EFBFBD><EFBFBD>
}
//<2F><><EFBFBD><EFBFBD>ADCֵ
//ch: @ref ADC_channels
//ͨ<><CDA8>ֵ 0~16ȡֵ<C8A1><D6B5>ΧΪ<CEA7><CEAA>ADC_Channel_0~ADC_Channel_16
//<2F><><EFBFBD><EFBFBD>ֵ:ת<><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
u16 Get_Adc(u8 ch)
{
//<2F><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ADC<44>Ĺ<EFBFBD><C4B9><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_480Cycles ); //ADC1,ADCͨ<43><CDA8>,480<38><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD>߲<EFBFBD><DFB2><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߾<EFBFBD>ȷ<EFBFBD><C8B7>
ADC_SoftwareStartConv(ADC1); //ʹ<><CAB9>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>ADC1<43><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//<2F>ȴ<EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
return ADC_GetConversionValue(ADC1); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>ADC1<43><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
//<2F><>ȡͨ<C8A1><CDA8>ch<63><68>ת<EFBFBD><D7AA>ֵ<EFBFBD><D6B5>ȡtimes<65><73><><C8BB>ƽ<EFBFBD><C6BD>
//ch:ͨ<><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//times:<3A><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
//<2F><><EFBFBD><EFBFBD>ֵ:ͨ<><CDA8>ch<63><68>times<65><73>ת<EFBFBD><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƽ<EFBFBD><C6BD>ֵ
u16 Get_Adc_Average(u8 ch,u8 times)
{
u32 temp_val=0;
u8 t;
for(t=0;t<times;t++)
{
temp_val+=Get_Adc(ch);
delay_ms(1);
}
return temp_val/times;
}