|
本帖最后由 ZHANGHAO 于 2020-10-27 08:38 编辑
我用STM32H743的ADC采集电压,参考电压用的3.6V,来检测两个3.3V
hadc1.Instance = ADC1;
hadc1.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV2;
hadc1.Init.Resolution = ADC_RESOLUTION_16B;
hadc1.Init.ScanConvMode = ADC_SCAN_ENABLE;
hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
hadc1.Init.LowPowerAutoWait = DISABLE;
hadc1.Init.ContinuousConvMode = ENABLE;
hadc1.Init.NbrOfConversion = 2;
hadc1.Init.DiscontinuousConvMode = DISABLE;
hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
hadc1.Init.ConversionDataManagement = ADC_CONVERSIONDATA_DMA_CIRCULAR;
hadc1.Init.Overrun = ADC_OVR_DATA_PRESERVED;
hadc1.Init.LeftBitShift = ADC_LEFTBITSHIFT_NONE;
hadc1.Init.OversamplingMode = DISABLE;
这是ADC的配置,ADC的时钟是50M
我用的DMA传输数据
HAL_ADCEx_Calibration_Start(&hadc1, ADC_CALIB_OFFSET, ADC_SINGLE_ENDED);
HAL_ADC_Start_DMA(&hadc1, (uint32_t*)AD_Value, 100);
这是ADC相关的值的定义
__attribute__((at(0x24000000))) uint16_t AD_Value[100]={0};
uint32_t AD_IN2;
uint32_t AD_IN5;
在主函数里面把ADC的数值打印出来
AD_IN2 = 0;
AD_IN5 = 0;
HAL_IWDG_Refresh(&hiwdg1);
for(int i = 0; i < 100;){
AD_IN2 = AD_IN2 + AD_Value[i++];
HAL_IWDG_Refresh(&hiwdg1);
AD_IN5 = AD_IN5 + AD_Value[i++];
HAL_IWDG_Refresh(&hiwdg1);
}
AD_IN2 = AD_IN2 / 50;
AD_IN5 = AD_IN5 / 50;
ReadRtcTime(CurrentTime);
HAL_UART_Transmit(&huart1,(uint8_t *)CurrentTime,strlen(CurrentTime),0xffff);
printf("\r\n******** ADC DMA Example ********\r\n\r\n");
printf(" ADC1 IN2 = %1.3fV \r\n", AD_IN2*3.6f/65535);
printf(" ADC1 IN5 = %1.3fV \r\n", AD_IN5*3.6f/65535);
刚开始的时候系统主频设置的是480M,但是现在发现这个主频电流太大,但是降到240的时候打印出来的数据是空,并且打印的数据也不全,下面是不正常的打印
ADC1 IN2 = 2020-10-20 11:35:10
******** ADC DMA Example ******** ADC1 IN2 = 2020-10-20 11:35:12
******** ADC DMA Example ******** ADC1 IN2 = 2020-10-20 11:35:13
******** ADC DMA Example ******** ADC1 IN2 = 2020-10-20 11:35:14
******** ADC DMA Example ******** ADC1 IN2 = 2020-10-20 11:35:15
******** ADC DMA Example ******** ADC1 IN2 = 2020-10-20 11:35:16
******** ADC DMA Example ******** ADC1 IN2 = 2020-10-20 11:35:17
******** ADC DMA Example ******** ADC1 IN2 =
正常打印出来应该像下面这样的
******** ADC DMA Example ********
ADC1 IN2 = 3.317V
ADC1 IN5 = 3.291V
2020-10-20 11:54:07
******** ADC DMA Example ********
ADC1 IN2 = 3.294V
ADC1 IN5 = 3.267V
2020-10-20 11:54:08
******** ADC DMA Example ********
ADC1 IN2 = 3.297V
ADC1 IN5 = 3.272V
2020-10-20 11:54:09
******** ADC DMA Example ********
ADC1 IN2 = 3.295V
ADC1 IN5 = 3.270V
2020-10-20 11:54:10
******** ADC DMA Example ********
ADC1 IN2 = 3.319V
ADC1 IN5 = 3.292V
我进入仿真模式看到的AD_Value的值是对的,但是打印不行,50平均的运算也不行,不知道什么地方的问题
我把采集位数由16降到12,由降到8位都是这样的问题,我只是把主频降了下,其余的都没有动,不知道是怎么回事,帮忙看看,我想降主频还能正常采集ADC,谢谢了
|
-
-
这是ADC时钟配置
|