一、光敏电阻原理图
二、配置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位的话,就程序就会把两次的值放在一个变量里面
六、串口助手验证