GD32F303固件库开发(10)----双ADC轮询模式扫描多个通道

36 篇文章 120 订阅

概述

本章主要配置,双ADC轮询模式扫描多个通道,通过串口进行打印。
查阅手册可以得知,PA9、PA10为串口0的输出和输入口。
查阅手册可以得知,PA9、PA10为串口0的输出和输入口。需要GD样片的可以加Q_qun申请:6_15061293 。
在这里插入图片描述

视频教学

GD32F303固件库开发(10)----双ADC轮询模式扫描多个通道

https://www.bilibili.com/video/BV1N94y1D7Yh/

csdn课程

课程更加详细。
https://download.csdn.net/course/detail/37144

样品申请

https://www.wjx.top/vm/wFGhGPF.aspx#

硬件准备

这里准备了1块开发板进行验证,分别是GD32303C_START开发板。
在这里插入图片描述

keil配置

microlib 进行了高度优化以使代码变得很小。 它的功能比缺省 C 库少,并且根本不具备某些 ISO C 特性。 某些库函数的运行速度也比较慢,如果要使用printf(),必须开启。
在这里插入图片描述

使能串口

  /* 使能GPI0A,用PA9、PA10为串口 */
    rcu_periph_clock_enable(RCU_GPIOA);

    /*使能串口0的时钟 */
    rcu_periph_clock_enable(RCU_USART0);

    /*配置USARTx_Tx(PA9)为复用推挽输出*/
    gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_9);
 
    /*配置USARTx_RxPA9)为浮空输入 */
    gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_10);

    /* USART 配置 */
    usart_deinit(USART0);//重置串口0
    usart_baudrate_set(USART0, 115200U);//设置串口0的波特率为115200
    usart_word_length_set(USART0, USART_WL_8BIT);      	// 帧数据字长
		usart_stop_bit_set(USART0, USART_STB_1BIT);      	 	// 停止位1位
    usart_parity_config(USART0, USART_PM_NONE);       	// 无奇偶校验位
    usart_receive_config(USART0, USART_RECEIVE_ENABLE);//使能接收器
    usart_transmit_config(USART0, USART_TRANSMIT_ENABLE);//使能发送器
    usart_enable(USART0);//使能USART

串口重定向

/* retarget the C library printf function to the USART */
int fputc(int ch, FILE *f)
{
    usart_data_transmit(USART0, (uint8_t)ch);
    while(RESET == usart_flag_get(USART0, USART_FLAG_TBE));
    return ch;
}

串口重定向后就可以使用printf进行打印。

ADC通道设置

在这里插入图片描述
在这里插入图片描述

ADC0初始化


///*************时钟配置******************/

    /*使能GPIOA时钟 */
    rcu_periph_clock_enable(RCU_GPIOA);
    /*使能ADC时钟 */
    rcu_periph_clock_enable(RCU_ADC0);
    /* 配置ADC速率 */
    rcu_adc_clock_config(RCU_CKADC_CKAPB2_DIV8);

ADC0配置

/*------------------ADC GPIO配置------------------*/
// 必须为模拟输入
    gpio_init(GPIOA, GPIO_MODE_AIN, GPIO_OSPEED_MAX, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2);

/*------------------ADC工作模式配置------------------*/
		// 设置adc工作在独立模式
		adc_mode_config(ADC_MODE_FREE);
		// 多通道用扫描模式
		//    adc_special_function_config(ADC0, ADC_SCAN_MODE, ENABLE);
		// 单通道用连续转换模式
//		adc_special_function_config(ADC0, ADC_CONTINUOUS_MODE, ENABLE); 


		// 结果转换右对齐
		adc_data_alignment_config(ADC0, ADC_DATAALIGN_RIGHT);
		// 转换通道1个
		adc_channel_length_config(ADC0, ADC_REGULAR_CHANNEL, 3);

    /* ADC regular channel config */
    adc_regular_channel_config(ADC0, 0, ADC_CHANNEL_0, ADC_SAMPLETIME_55POINT5);
    adc_regular_channel_config(ADC0, 1, ADC_CHANNEL_1, ADC_SAMPLETIME_55POINT5);
    adc_regular_channel_config(ADC0, 2, ADC_CHANNEL_2, ADC_SAMPLETIME_55POINT5);


		// 不用外部触发转换,软件开启即可
		adc_external_trigger_source_config(ADC0, ADC_REGULAR_CHANNEL, ADC0_1_2_EXTTRIG_REGULAR_NONE);
		adc_external_trigger_config(ADC0, ADC_REGULAR_CHANNEL, ENABLE);
    
		// 使能ADC
		adc_enable(ADC0);
		delay_1ms(1);                                                   // 等待1ms
		// 使能ADC校准
		adc_calibration_enable(ADC0);

ADC1初始化

/*************时钟配置******************/

    /*使能GPIOA时钟 */
    rcu_periph_clock_enable(RCU_GPIOB);
    /*使能ADC时钟 */
    rcu_periph_clock_enable(RCU_ADC1);
    /* 配置ADC速率 */
    rcu_adc_clock_config(RCU_CKADC_CKAPB2_DIV8);	

ADC1配置

/*------------------ADC GPIO配置------------------*/
// 必须为模拟输入
    gpio_init(GPIOA, GPIO_MODE_AIN, GPIO_OSPEED_MAX, GPIO_PIN_7);
    gpio_init(GPIOB, GPIO_MODE_AIN, GPIO_OSPEED_MAX, GPIO_PIN_0 | GPIO_PIN_1);
/*------------------ADC工作模式配置------------------*/
		// 设置adc工作在独立模式
		adc_mode_config(ADC_MODE_FREE);
		// 多通道用扫描模式
		//    adc_special_function_config(ADC0, ADC_SCAN_MODE, ENABLE);
		// 单通道用连续转换模式
//		adc_special_function_config(ADC0, ADC_CONTINUOUS_MODE, ENABLE); 


		// 结果转换右对齐
		adc_data_alignment_config(ADC1, ADC_DATAALIGN_RIGHT);
		// 转换通道1个
		adc_channel_length_config(ADC1, ADC_REGULAR_CHANNEL, 3);

    /* ADC regular channel config */
    adc_regular_channel_config(ADC1, 0, ADC_CHANNEL_7, ADC_SAMPLETIME_55POINT5);
    adc_regular_channel_config(ADC1, 1, ADC_CHANNEL_8, ADC_SAMPLETIME_55POINT5);
    adc_regular_channel_config(ADC1, 2, ADC_CHANNEL_9, ADC_SAMPLETIME_55POINT5);


		// 不用外部触发转换,软件开启即可
		adc_external_trigger_source_config(ADC1, ADC_REGULAR_CHANNEL, ADC0_1_2_EXTTRIG_REGULAR_NONE);
		adc_external_trigger_config(ADC1, ADC_REGULAR_CHANNEL, ENABLE);
    
		// 使能ADC
		adc_enable(ADC1);
		delay_1ms(1);                                                   // 等待1ms
		// 使能ADC校准
		adc_calibration_enable(ADC1);

ADC数据采集

uint16_t  get_adc(uint32_t adc_periph , uint8_t adc_channel)
{
/* 配置规则通道采集*/
    adc_regular_channel_config(adc_periph, 0, adc_channel, ADC_SAMPLETIME_55POINT5);
		// 由于没有采用外部触发,所以使用软件触发ADC转换
		adc_software_trigger_enable(adc_periph, ADC_REGULAR_CHANNEL);   
				
		while(!adc_flag_get(adc_periph, ADC_FLAG_EOC));                       // 等待采样完成
		adc_flag_clear(adc_periph, ADC_FLAG_EOC);                             // 清除结束标志
				
		return  adc_regular_data_read(adc_periph);                         // 读取ADC数据
}

最后

以上的代码会在Q_qun里分享。QQ_qun:615061293。
或者关注『记帖』,持续更新文章和学习资料!
在这里插入图片描述

数据采集

    while (1){
        
		uint16_t adc0Value0 = 0;
		uint16_t adc0Value1 = 0;
		uint16_t adc0Value2 = 0;
	
		adc0Value0=get_adc(ADC0 ,ADC_CHANNEL_0);
		adc0Value1=get_adc(ADC0 ,ADC_CHANNEL_1);
		adc0Value2=get_adc(ADC0 ,ADC_CHANNEL_2);


	printf("\nadc0_IN0(PA0)=%4.0d,电压=%1.4f",adc0Value0,adc0Value0*3.3f/4095);
	printf("\nadc0_IN1(PA1)=%4.0d,电压=%1.4f",adc0Value1,adc0Value1*3.3f/4095);
	printf("\nadc0_IN2(PA2)=%4.0d,电压=%1.4f",adc0Value2,adc0Value2*3.3f/4095);
			
		uint16_t adc1Value0 = 0;
		uint16_t adc1Value1 = 0;
		uint16_t adc1Value2 = 0;
		
		adc1Value0=get_adc(ADC1 ,ADC_CHANNEL_7);
		adc1Value1=get_adc(ADC1 ,ADC_CHANNEL_8);
		adc1Value2=get_adc(ADC1 ,ADC_CHANNEL_9);

	printf("\nadc1_IN7(PA7)=%4.0d,电压=%1.4f",adc1Value0,adc1Value0*3.3f/4095);
	printf("\nadc1_IN8(PB0)=%4.0d,电压=%1.4f",adc1Value1,adc1Value1*3.3f/4095);
	printf("\nadc1_IN9(PB1)=%4.0d,电压=%1.4f",adc1Value2,adc1Value2*3.3f/4095);
	delay_1ms(1000);					
    }

测试结果

输入固定电压进行测试。

在这里插入图片描述
测试结果如下。

在这里插入图片描述

  • 7
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
HAL是针对ST公司的STM32系列微控制器开发的一套软件。它为开发者提供了一些常用的功能模块和驱动程序,以简化STM32的开发过程。其中,多路ADC DMA是HAL中的一个功能模块,主要用于实现多通道ADC的数据采集和DMA传输。 在STM32F103芯片上,通过HAL,我们可以轻松地使用多路ADC DMA功能。具体来说,我们可以先配置ADC,设置好需要采集的通道数量和采样周期等参数。然后,通过DMA传输控制器,将ADC转换结果自动传输到指定的内存区域。这样,我们就可以在程序中方便地访问这些采集到的数据了。 在使用多路ADC DMA功能时,我们需要包含相关的文件,其中包括了初始化以及配置ADC和DMA相关的函数。通过调用这些函数,我们可以实现对ADC和DMA的配置和控制。同时,我们还可以通过中断或轮询等方式,获取采集到的数据并进行相应的处理。 对于HAL版本3.zip,这可能是指HAL的第三个版本的压缩包。通过解压这个压缩包,我们可以获得相应版本的HAL文件和示例代码等资源,方便我们进行STM32F103多路ADC DMA的开发工作。 总之,通过HAL中的多路ADC DMA功能,我们可以简化STM32F103开发过程,实现高效的数据采集和处理。通过使用HAL版本3.zip,我们可以获取到相应的文件和示例代码等资源,帮助我们更好地使用这些功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

记帖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值