用STM32 + cubemx,采集光敏电阻信息

一、光敏电阻原理图

二、配置cubemx ,adc模块

开启dma



三、配置串口模块

 四、写代码

1、ADC DMA开启

    //adc dma数组
	uint16_t adc_val_group[10];
	memset(adc_val_group,0,sizeof(adc_val_group));

    //开启adc dma传输
	HAL_ADCEx_Calibration_Start(&hadc1);
	HAL_ADC_Start_DMA(&hadc1,(uint32_t *)adc_val_group,10);

2、开启串口传输

//串口buf
	char UART_TX_Buf[UART_TX_BUF_LEN];
	memset(UART_TX_Buf,0,sizeof(UART_TX_Buf));

//字符串生成和串口传输
    HAL_UART_Transmit(&huart1,(uint8_t *)UART_TX_Buf,strlen(UART_TX_Buf),0xffff);

 3、总体例程

检测模块的电压值,控制led灯的亮灭


/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "adc.h"
#include "dma.h"
#include "usart.h"
#include "gpio.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include <string.h>
#include <stdlib.h>
#include "stdint.h"
#include <stdio.h>
/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
float adc_average(uint16_t *adcBuf,int len)
{
	unsigned long int total_val = 0;
	float ret = 0;
	for(int i = 0;i < len;i++)
	{
		total_val += adcBuf[i];
	}
	ret = (float)total_val/len;
	ret = ret/4096;
	ret = ret * 3.3;
	return ret;
}
	//ADCÖµ
	float adc_val = 0;
/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
#define UART_TX_BUF_LEN 50

/* 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 */

/* 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_ADC1_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */

	
	//adc²É¼¯Êý×é
	uint16_t adc_val_group[10];
	memset(adc_val_group,0,sizeof(adc_val_group));
	//´®¿ÚÊý×é
	char UART_TX_Buf[UART_TX_BUF_LEN];
	memset(UART_TX_Buf,0,sizeof(UART_TX_Buf));

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
	//¿ªÆôADC DMA´«Êä
	HAL_ADCEx_Calibration_Start(&hadc1);
	HAL_ADC_Start_DMA(&hadc1,(uint32_t *)adc_val_group,5);
  while (1)
  {
		adc_val = adc_average(adc_val_group,5);
		
		//Éú³É×Ö·û´®
		
		sprintf(UART_TX_Buf,"adc_val = %f\r\n",adc_val);
		/*
		HAL_Delay(1000);
		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_8,GPIO_PIN_SET);
		HAL_Delay(1000);
		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_8,GPIO_PIN_RESET);
		*/
		//¿ØÖÆledµÆµÄÁÁÃð
		if(adc_val > 1.6)
		{
			HAL_GPIO_WritePin(GPIOA,GPIO_PIN_8,GPIO_PIN_SET);//¹Ø±ÕLEDµÆ
		}			
		else
		{
			HAL_GPIO_WritePin(GPIOA,GPIO_PIN_8,GPIO_PIN_RESET);//´ò¿ªledµÆ
		}
		//·¢ËÍ×Ö·û´®
		HAL_UART_Transmit(&huart1,(uint8_t *)UART_TX_Buf,strlen(UART_TX_Buf),0xffff);
		
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

五、记录遇到的小问题

1、调试的时候看不到数组里面成员变量的值

设置到0级优化

2、adc dma传输,值过大

	uint16_t adc_val_group[10];

    //用于接收adc dma传输的数组,元素必须是16位的变量,如果是32位的话,就程序就会把两次的值放在一个变量里面

六、串口助手验证

 

  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值