完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
最近在做项目时需要stm32f103分别读取角度传感器值和电压值,采用HAL库+CubeMX方式并没有找到像标准库一样直接可以调用ADC_RegularChannelConfig()函数选择ADC的通道,各种查找后找到一种解决方案,分享一下。
1 利用CubeMX建立工程 这里采用的是常用的STM32F103C8T6芯片,选择外部高频时钟,SWD调试 根据原理图,PA6口采集电压值,PA3口采集角度传感器值,分别对应ADC1通道6和通道3 配置ADC1,选择ADC通道3和通道6,独立模式、右对齐、取消规则转换 配置串口,方便打印角度值和电压值 设置主时钟为72MHz,完成CubeMX工程配置。 2 编写单独读取ADC通道函数 建立sConfig结构体,选择不同通道实现单独读取 //ch(1-6Chnnal),times(读取次数) uint32_t ADC_Get_Average(uint8_t ch,uint8_t times) { ADC_ChannelConfTypeDef sConfig; //通道初始化 uint32_t value_sum=0; uint8_t i; switch(ch) //选择ADC通道 { case 1:sConfig.Channel = ADC_CHANNEL_1;break; case 2:sConfig.Channel = ADC_CHANNEL_2;break; case 3:sConfig.Channel = ADC_CHANNEL_3;break; case 4:sConfig.Channel = ADC_CHANNEL_4;break; case 5:sConfig.Channel = ADC_CHANNEL_5;break; case 6:sConfig.Channel = ADC_CHANNEL_6;break; } sConfig.SamplingTime = ADC_SAMPLETIME_239CYCLES_5; //采用周期239.5周期 sConfig.Rank = 1; HAL_ADC_ConfigChannel(&hadc1,&sConfig); for(i=0;i HAL_ADC_Start(&hadc1); //启动转换 HAL_ADC_PollForConversion(&hadc1,30); //等待转化结束 value_sum += HAL_ADC_GetValue(&hadc1); //求和 HAL_ADC_Stop(&hadc1); //停止转换 } return value_sum/times; //返回平均值 } 使用printf()重定义 #ifdef __GNUC__ #define PUTCHAR_PROTOTYPE int __io_putchar(int ch) #else #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f) #endif PUTCHAR_PROTOTYPE { HAL_UART_Transmit(&huart1 , (uint8_t *)&ch, 1, 0xFFFF); return ch; } 主函数程序代码 int main(void) { /* USER CODE BEGIN 1 */ uint16_t angle_get; //角度值保存 uint16_t volage_get; //电压值保存 /* USER CODE END 1 */ /* MCU Configuration--------------------------------------------------------*/ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); /* USER CODE BEGIN Init */ /* USER CODE END Init */ /* Configure the system clock */ SystemClock_Config(); /* USER CODE BEGIN SysInit */ /* USER CODE END SysInit */ /* Initialize all configured peripherals */ MX_GPIO_Init(); MX_ADC1_Init(); MX_USART1_UART_Init(); /* USER CODE BEGIN 2 */ HAL_ADCEx_Calibration_Start(&hadc1); //校准ADC1 /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { HAL_Delay(500); volage_get = ADC_Get_Average(6,4); //读取电压值 volage_get = volage_get*3.3*100*11/4096; //转换电压,扩大100倍 angle_get = ADC_Get_Average(3,4); //读取角度值 printf("电压值:%d.%d,角度值:%dn",volage_get/100,volage_get%100,angle_get); // HAL_UART_Transmit(&huart1,"tn",8,30); /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ } /* USER CODE END 3 */ } 3 下载代码验证 串口打印结果 如有问题欢迎各位指出!!! |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1617 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1543 浏览 1 评论
977 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
683 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1595 浏览 2 评论
1863浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
644浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
515浏览 3评论
531浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
504浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 04:46 , Processed in 0.773000 second(s), Total 79, Slave 62 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号