作者:额外的房间 | 来源:互联网 | 2023-10-11 04:30
ADC多通道采集(阻塞模式、ADC_DMA模式) ADC多通道采集(阻塞模式) ADC多通道采集(DMA模式)
ADC多通道采集(阻塞模式) 1、时钟源配置
2、配置RCC时钟(选择第三个选项 Crystal/Ceramic Resonator 晶体/陶瓷谐振器 ) 3、配置一个LED灯,在程序编写中让它闪烁代表程序没有死机。 4、设置调试模式,我们选择SW 5、设置串口,因为我们的程序采集到了adc的数值之后会发送到串口调试助手上,证明ADC采集是否成功。选择异步模式、波特率是默认的115200.其他配置也是默认的 6、配置ADC。这里我选择的两个通到采集,分别是PA0、PA1.主要是配制成:扫描模式、连续转换模式、间断模式、 设置为2个通道 采用软件触发方式启动采集 2个通道各自的参数设置
7、优先级设置高一点,怕的中断其他干扰 下面是主要的代码 。
int fputc ( int ch, FILE * f) { HAL_UART_Transmit ( & huart1, ( uint8_t * ) & ch, 1 , 0xffff ) ; return ch; } uint16_t Get_adc ( ) { HAL_ADC_Start ( & hadc1) ; HAL_ADC_PollForConversion ( & hadc1, 100 ) ; if ( HAL_IS_BIT_SET ( HAL_ADC_GetState ( & hadc1) , HAL_ADC_STATE_REG_EOC ) ) { return HAL_ADC_GetValue ( & hadc1) ; } return 0 ; }
下面是while循环的代码
HAL_GPIO_TogglePin ( GPIOC , GPIO_PIN_13 ) ; HAL_Delay ( 1000 ) ; for ( uint8_t i&#61; 0 ; i< 2 ; i&#43;&#43; ) { ADC_Value[ i] &#61; Get_adc ( ) ; } for ( uint8_t i&#61; 0 ; i< 2 ; i&#43;&#43; ) { printf ( "ADC通道%d,:%.4f V\r\n" , i, ( ADC_Value[ i] * 3.3 / 4096 ) ) ; }
ADC多通道采集&#xff08;DMA模式&#xff09; 配置基本上与阻塞模式的相同&#xff0c;除了ADC的设置外。 DMA配置
mode&#xff1a;模式
Normal&#xff1a;正常模式&#xff0c;当一次DMA数据传输完后&#xff0c;停止DMA传送 &#xff0c;也就是只传输一次
Circular&#xff1a; 循环模式&#xff0c;传输完成后又重新开始继续传输&#xff0c;不断循环永不停止
data width&#xff1a;数据宽度
byte&#xff1a;字节&#xff0c;通用8位&#xff0c;与u8相同
word&#xff1a;字长&#xff0c;与硬件的位数相同&#xff0c;STM32是32位&#xff0c;所以对应是u32
Half Word&#xff1a;半个字长&#xff0c;所以对应是u16
Memory打钩表示存储ADC值的内存地址&#xff08;数组&#xff09;会自增
1、我们在设置了DMA传输数据&#xff0c;就要取消ADC转换完成中断。 2、代码的思想。是在while中调用启动函数&#xff0c;待ADC采集及DMA传输完成之后。我们在DMA传输完成中断服务函数中把采集到的职打印到串口上。
int fputc ( int ch, FILE * f) { HAL_UART_Transmit ( & huart1, ( uint8_t * ) & ch, 1 , 0xffff ) ; return ch; } #define ADC_MAX_NUM 2 uint16_t ADC_Values[ ADC_MAX_NUM ] &#61; { 0 } ; void ADC_DMA_caiji ( ) { HAL_ADC_Start_DMA ( & hadc1, ( uint32_t * ) ADC_Values, ADC_MAX_NUM ) ; } void HAL_ADC_ConvCpltCallback ( ADC_HandleTypeDef* hadc) { printf ( "烟雾%d\r\n" , ADC_Values[ 0 ] ) ; printf ( "光电%d\r\n" , ADC_Values[ 1 ] ) ; HAL_ADC_Stop_DMA ( & hadc1) ; }
下面是在while中的代码
HAL_GPIO_TogglePin ( LED1_GPIO_Port, LED1_Pin) ; ADC_DMA_caiji ( ) ; HAL_Delay ( 2000 ) ;
2、成果展示 写的不好&#xff0c;请多多见谅。有问题的可以联系我修改。