Skip to content

STM32F103 CubeMX ADC 驱动 PS2游戏摇杆控制杆传感器模块

1. 硬件连接

PA1 和PA2 分别对应了ADC的两个PIN

alt text

2. CubeMX生成代码

配置debug口

alt text

配置时钟

alt text

配置ADC

alt text

配置串口

alt text

生成工程

alt text

3. 编写代码

串口重定向 将串口的代码重新使用了printf来输出,

C
#include <stdio.h>
 //重定向c库函数printf到串口USARTx,重定向后可使用printf函数
 int fputc(int ch, FILE *f)
 {
     /* 发送一个字节数据到串口USARTx */
     HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
     return (ch);
 }

3.1 分两个ADC,分别读取ADC的值

分两个ADC,分别读取ADC的值,

分两个ADC,分别读取ADC的值
c
/**
  * @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_ADC1_Init();
  MX_ADC2_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */
uint16_t ADC1_number = 0;
uint16_t ADC2_number = 0;

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
	  HAL_ADC_Start(&hadc1);
	  HAL_ADC_PollForConversion(&hadc1,HAL_MAX_DELAY);
	  ADC1_number = (uint16_t)HAL_ADC_GetValue(&hadc1);
	  
	  HAL_ADC_Start(&hadc2);
	  HAL_ADC_PollForConversion(&hadc2,HAL_MAX_DELAY);
	  ADC2_number = (uint16_t)HAL_ADC_GetValue(&hadc2);
	  
	  
	  printf("adc0: %d,adc1:%d \r\n",ADC1_number,ADC2_number);
	  HAL_Delay(100);
	  
    /* USER CODE END WHILE */

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

4. 后记

此ADC为12位ADC,实际的有效位数为10位左右,可以应付一些常见的场合,在使用的时候也可以多次采样,获得平均值,提升采样精度。