新手上路
- 积分
- 44
- 金钱
- 44
- 注册时间
- 2019-7-19
- 在线时间
- 10 小时
|
1金钱
- #include "adc.h"
- #include "delay.h"
- #include "led.h"
- /*200Khz正弦波是0.005ms*/
- ADC_HandleTypeDef ADC1_Handler;
- void My_Adc_Init()
- {
- ADC1_Handler.Instance=ADC1;
- ADC1_Handler.Init.ClockPrescaler=ADC_CLOCK_SYNC_PCLK_DIV2; //2分频,ADCCLK=PER_CK/4=64/2=32MHZ
- ADC1_Handler.Init.Resolution=ADC_RESOLUTION_16B; //16位模式
- ADC1_Handler.Init.ScanConvMode=DISABLE; //非扫描模式
- ADC1_Handler.Init.EOCSelection=ADC_EOC_SINGLE_CONV; //关闭EOC中断
- ADC1_Handler.Init.LowPowerAutoWait=DISABLE; //自动低功耗关闭
- ADC1_Handler.Init.ContinuousConvMode=DISABLE; //关闭连续转换
- ADC1_Handler.Init.NbrOfConversion=1; //1个转换在规则序列中 也就是只转换规则序列1
- ADC1_Handler.Init.DiscontinuousConvMode=DISABLE; //禁止不连续采样模式
- ADC1_Handler.Init.NbrOfDiscConversion=0; //不连续采样通道数为0
- ADC1_Handler.Init.ExternalTrigConv=ADC_SOFTWARE_START; //软件触发
- ADC1_Handler.Init.ExternalTrigConvEdge=ADC_EXTERNALTRIGCONVEDGE_NONE;//使用软件触发
- ADC1_Handler.Init.BoostMode=ENABLE; //BOOT模式关闭
- ADC1_Handler.Init.Overrun=ADC_OVR_DATA_OVERWRITTEN; //有新的数据的死后直接覆盖掉旧数据
- ADC1_Handler.Init.OversamplingMode=DISABLE; //过采样关闭
- ADC1_Handler.Init.ConversionDataManagement=ADC_CONVERSIONDATA_DR; //规则通道的数据仅仅保存在DR寄存器里面
- HAL_ADC_Init(&ADC1_Handler); //初始化
-
- HAL_ADCEx_Calibration_Start(&ADC1_Handler,ADC_CALIB_OFFSET,ADC_SINGLE_ENDED); //ADC校准
- HAL_ADC_Start_IT(&ADC1_Handler);
- }
- void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc)
- {
- GPIO_InitTypeDef GPIO_Initure;
- if(hadc->Instance==ADC1)
- {
- __HAL_RCC_ADC12_CLK_ENABLE(); //使能ADC1/2时钟
- __HAL_RCC_GPIOA_CLK_ENABLE(); //开启GPIOA时钟
- __HAL_RCC_ADC_CONFIG(RCC_ADCCLKSOURCE_CLKP); //ADC外设时钟选择
-
- HAL_NVIC_SetPriority(ADC_IRQn, 0, 0);
- HAL_NVIC_EnableIRQ(ADC_IRQn);
-
- GPIO_Initure.Pin=GPIO_PIN_5; //PA5
- GPIO_Initure.Mode=GPIO_MODE_ANALOG; //模拟
- GPIO_Initure.Pull=GPIO_NOPULL; //不带上下拉
- HAL_GPIO_Init(GPIOA,&GPIO_Initure);
- }
- }
- u16 Get_Adc(u32 ch)
- {
- ADC_ChannelConfTypeDef ADC1_ChanConf;
-
- ADC1_ChanConf.Channel=ch; //通道
- ADC1_ChanConf.Rank=ADC_REGULAR_RANK_1; //1个序列
- ADC1_ChanConf.SamplingTime=ADC_SAMPLETIME_2CYCLES_5; //采样时间,2.5周期采一次,时间是0.3us
- ADC1_ChanConf.SingleDiff=ADC_SINGLE_ENDED; //单边采集
- ADC1_ChanConf.OffsetNumber=ADC_OFFSET_NONE;
- ADC1_ChanConf.Offset=0;
- HAL_ADC_ConfigChannel(&ADC1_Handler,&ADC1_ChanConf); //通道配置
- HAL_ADC_Start_IT(&ADC1_Handler); //开启ADC
-
- HAL_ADC_PollForConversion(&ADC1_Handler,10); //轮询转换
- return (u16)HAL_ADC_GetValue(&ADC1_Handler); //返回最近一次ADC1规则组的转换结果
- }
- u16 Get_Adc_Average(u32 ch,u8 times)
- {
- u32 temp_val=0;
- u8 t;
- for(t=0;t<times;t++)
- {
- temp_val+=Get_Adc(ch);
- delay_ms(5);
- }
- return temp_val/times;
- }
- void ADC1_IRQHandler()
- {
- HAL_ADC_IRQHandler(&ADC1_Handler);
- }
- void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* AdcHandle)
- {
- if(AdcHandle->Instance == ADC1)
- {
- LED0(0);
- }
- }
复制代码
|
|