完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
软件:STM32CubeMX,MDK-ARM
硬件:蓝桥杯物联网Lora开发板,板载芯片STM32L071 一、前言 ADC,模拟信号只有通过A/D转化为数字信号后才能用软件进行处理,这一切都是通过A/D转换器(ADC)来实现的。 板子上所使用的两个电位器,接的是PB0、PB1,也就是通道8和通道9。 二、单通道ADC 这里采用的是OLED显示电压,对OLED有疑惑地可以看看我的文章。 也可以使用串口发送到上位机。 1、STM32CubeMX配置 在Analog中选择ADC的通道9。给板子上的两个LED引脚配置为OUTPUT,命名为KEY1、KEY2。 2、代码 添加好OLED的模块代码,其他的不需要更改,添加以下代码即可。 #include "main.h" #include "adc.h" #include "gpio.h" #include "oled.h" #include "stdio.h" void SystemClock_Config(void); void Task_BrdInit(void) { OLED_PowerControl(ENABLE); HAL_Delay(200); OLED_Init(); OLED_Clear(); OLED_ShowString(0, 0, (unsigned char *)" ", 16); OLED_ShowString(0, 2, (unsigned char *)" ", 16); } int main(void) { char lcdLine_1st_line[16]; char lcdLine_2st_line[16]; HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_ADC_Init(); Task_BrdInit(); float adc_value=0; while (1) { /* USER CODE END WHILE */ HAL_ADC_Start(&hadc);//开启转换 adc_value = HAL_ADC_GetValue(&hadc)*33/4095; sprintf((char*)lcdLine_1st_line, "ADC:%3.1fV", adc_value/10.0); if(adc_value<15) { HAL_GPIO_WritePin(KEY1_GPIO_Port,KEY1_Pin,GPIO_PIN_SET); HAL_GPIO_WritePin(KEY2_GPIO_Port,KEY1_Pin,GPIO_PIN_SET); sprintf(lcdLine_2st_line, "K1-LED ON "); } else{ HAL_GPIO_WritePin(KEY1_GPIO_Port,KEY1_Pin,GPIO_PIN_SET); HAL_GPIO_WritePin(KEY2_GPIO_Port,KEY1_Pin,GPIO_PIN_RESET); sprintf(lcdLine_2st_line, "K2-LED ON "); } OLED_ShowString(0, 0, (unsigned char *)lcdLine_1st_line, 16); OLED_ShowString(0, 2, (unsigned char *)lcdLine_2st_line, 16); HAL_ADC_Stop(&hadc);//停止转换 /* USER CODE BEGIN 3 */ } /* USER CODE END 3 */ } 三、双通道DMA采集 1、STM32CubeMX配置 开启ADC连续转换。 DMA有normal和circular两种模式。 circular用法: 2、代码 #include "main.h" #include "adc.h" #include "dma.h" #include "gpio.h" /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ #include "oled.h" #include "stdio.h" #include "string.h" void SystemClock_Config(void); void Task_BrdInit(void) { OLED_PowerControl(ENABLE); HAL_Delay(200); OLED_Init(); OLED_Clear(); OLED_ShowString(0, 0, (unsigned char *)" ", 16); OLED_ShowString(0, 2, (unsigned char *)" ", 16); } /* USER CODE END Includes */ /* Private typedef -----------------------------------------------------------*/ /* USER CODE BEGIN PTD */ /* USER CODE END PTD */ /* Private define ------------------------------------------------------------*/ /* USER CODE BEGIN PD */ /* USER CODE END PD */ /* Private macro -------------------------------------------------------------*/ /* USER CODE BEGIN PM */ /* USER CODE END PM */ /* Private variables ---------------------------------------------------------*/ /* USER CODE BEGIN PV */ /* USER CODE END PV */ /* Private function prototypes -----------------------------------------------*/ void SystemClock_Config(void); /* USER CODE BEGIN PFP */ /* USER CODE END PFP */ /* Private user code ---------------------------------------------------------*/ /* USER CODE BEGIN 0 */ char lcdLine_1st_line[16]; char lcdLine_2st_line[16]; uint32_t Adc_Value[2]; float rep_value1,rep_value2; void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc) //DMA ADC的响应函数 { rep_value1=Adc_Value[1]*33/4095; rep_value2=Adc_Value[0]*33/4095; sprintf((char*)lcdLine_1st_line, "ADC1:%3.2fV", rep_value1/10.0); sprintf((char*)lcdLine_2st_line, "ADC2:%3.2fV", rep_value2/10.0); } /* USER CODE END 0 */ /** * @brief The application entry point. * @retval int */ int main(void) { /* USER CODE BEGIN 1 */ /* 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_DMA_Init(); MX_ADC_Init(); /* USER CODE BEGIN 2 */ HAL_GPIO_WritePin(GPIOC, GPIO_PIN_15, GPIO_PIN_RESET); Task_BrdInit(); HAL_ADCEx_Calibration_Start(&hadc,ADC_SINGLE_ENDED); /*adc校正,这个函数我也没搞明白后面那个值是什么意思,试过其他的数值,没什么不一样的*/ /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ HAL_ADC_Start_DMA(&hadc,Adc_Value,2); HAL_Delay(100); if(rep_value1<15) { HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,GPIO_PIN_SET); } else{ HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,GPIO_PIN_RESET); } if(rep_value2<15){ HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_SET); } else{ HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_RESET); } OLED_ShowString(0, 0, (unsigned char *)lcdLine_1st_line, 16); OLED_ShowString(0, 2, (unsigned char *)lcdLine_2st_line, 16); } /* USER CODE END 3 */ } 四、效果 |
|
|
|
只有小组成员才能发言,加入小组>>
3275 浏览 9 评论
2950 浏览 16 评论
3454 浏览 1 评论
8982 浏览 16 评论
4043 浏览 18 评论
1092浏览 3评论
564浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
561浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2297浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1854浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-19 05:20 , Processed in 1.102107 second(s), Total 80, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号