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位左右,可以应付一些常见的场合,在使用的时候也可以多次采样,获得平均值,提升采样精度。