请教大侠: 小弟现在使用G070的12位ADC进行12个通道采集 现在方案是 每次进行通道配置,启动采集一个通道,然后循环12个通道 下面是CUBE中的配置 下面是自动生成的代码 hadc1.Instance = ADC1; hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4; hadc1.Init.Resolution = ADC_RESOLUTION_12B; hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT; hadc1.Init.ScanConvMode = ADC_SCAN_SEQ_FIXED; hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV; hadc1.Init.LowPowerAutoWait = DISABLE; hadc1.Init.LowPowerAutoPowerOff = DISABLE; hadc1.Init.ContinuousConvMode = DISABLE; hadc1.Init.NbrOfConversion = 12; hadc1.Init.DiscontinuousConvMode = DISABLE; hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START; hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; hadc1.Init.DMAContinuousRequests = DISABLE; hadc1.Init.Overrun = ADC_OVR_DATA_PRESERVED; hadc1.Init.SamplingTimeCommon1 = ADC_SAMPLETIME_79CYCLES_5; hadc1.Init.OversamplingMode = DISABLE; hadc1.Init.TriggerFrequencyMode = ADC_TRIGGER_FREQ_HIGH; if (HAL_ADC_Init(&hadc1) != HAL_OK) { Error_Handler(); } /** Configure Regular Channel */ sConfig.Channel = ADC_CHANNEL_0; sConfig.Rank = ADC_RANK_CHANNEL_NUMBER; if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) { Error_Handler(); } /** Configure Regular Channel */ sConfig.Channel = ADC_CHANNEL_1; if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) { Error_Handler(); } /** Configure Regular Channel */ sConfig.Channel = ADC_CHANNEL_2; if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) { Error_Handler(); } /** Configure Regular Channel */ sConfig.Channel = ADC_CHANNEL_3; if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) { Error_Handler(); } /** Configure Regular Channel */ sConfig.Channel = ADC_CHANNEL_4; if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) { Error_Handler(); } /** Configure Regular Channel */ sConfig.Channel = ADC_CHANNEL_5; if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) { Error_Handler(); } /** Configure Regular Channel */ sConfig.Channel = ADC_CHANNEL_6; if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) { Error_Handler(); } /** Configure Regular Channel */ sConfig.Channel = ADC_CHANNEL_7; if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) { Error_Handler(); } /** Configure Regular Channel */ sConfig.Channel = ADC_CHANNEL_8; if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) { Error_Handler(); } /** Configure Regular Channel */ sConfig.Channel = ADC_CHANNEL_9; if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) { Error_Handler(); } /** Configure Regular Channel */ sConfig.Channel = ADC_CHANNEL_10; if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) { Error_Handler(); } /** Configure Regular Channel */ sConfig.Channel = ADC_CHANNEL_11; if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) { Error_Handler(); } /* USER CODE BEGIN ADC1_Init 2 */ /* Run ADC calibration */ if (HAL_ADCEx_Calibration_Start(&hadc1) != HAL_OK) { Error_Handler(); } /* USER CODE END ADC1_Init 2 */ } 连续扫描12个通道,我用的是下面的代码 /****************************************************************************** * @功能简介 : 单次采样12个通道一个函数 * @参 数 : 无 * @返 回 值 : 无 *******************************************************************************/ void ADC_SCAN_SAMPLE(void) { uint8_t i; uint8_t chn=0; uint16_t adc_result = 0x0000; uint8_t adc_print[24]; /* 启动转换 */ HAL_ADC_Start(&hadc1); do { /* 等待转换完成 */ if (HAL_ADC_PollForConversion(&hadc1, ADC_TIMEOUT) != HAL_TIMEOUT) { /* 获取通道转换数据 */ ADC_Val_Buf[chn] = HAL_ADC_GetValue(&hadc1); } chn++; }while(chn==12); RS485_Transmit(startB,3); for(i=0;i<12;i++) { adc_print[i*2] = (uint8_t)(ADC_Val_Buf>>8); adc_print[i*2+1] = (uint8_t)(ADC_Val_Buf); } RS485_Transmit(adc_print,24); } 实际采集时,除了通道0有数据,其他通道返回全是0,请教下这是哪里配置问题吗? 我需要对通道0到通道11进行采集,求教!!! |
STM32G0是否支持trace?
Stm32G071 i2c slave配置问题
stm32G0B1RCT6在串口快速收发时导致中断服务函数无法进入
STM32G0读写保护疑问
STM32G070 i2c timing配置疑问
请问STM32G071KBT6的program管脚PA13和boot0管脚PA14可以复用为普通IO吗?
请问怎么基于stm32实现IAP功能?即boot leader和APP两块程序合并,用的是STM32G070RB。
STM32G0B1KBU3N如何使用外部被動晶振?
有关STM32G030K6T6芯片ADC采集电压问题?
有关STM32G030K6T6芯片Flash写入问题?
/******************************************************************************
* @功能简介 : 获取指定ADC通道数据函数
* @参 数 : ch 指定ADC通道
* @返 回 值 : 无
*******************************************************************************/
uint16_t ADC_ONCHIP_Get_Data(uint8_t ch)
{
//设置指定ADC的规则组通道,一个序列,采样时间,如果一个序列有多个通道,则用多个ADC_RegularChannelConfig()函数配置顺序
ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 ); //ADC1,ADC通道,采样时间为239.5周期
ADC_SoftwareStartConvCmd(ADC1, ENABLE); //使能指定的ADC1的软件转换启动功能
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束
return ADC_GetConversionValue(ADC1); //返回最近一次ADC1规则组的转换结果
}
HAL刚开始使用不久,普通的UART,GPIO等移植比较简直,ADC就有点烦了