STM32的ADC(遥杆的控制)

1 遥杆

我们在控制电机或者其他设备的时候经常会用到摇杆,如图1所示。遥杆提供了x,y两个方向的模拟量输入和z方向的数字量输入。

图1 摇杆的实物

摇杆的内部构造如图2所示。x和y方向各有一个电位器,在拨动摇杆的时候,x,y方向输出的 模拟电压量会跟着变化,因此只要测量x,y方向的电压值,就可以知道摇杆的位置。

图2 摇杆内部电路示意图

可以使用STM32的AD转换器,测量摇杆的输入。

2. STM32的ADC

STM32 ADC的结构框图如图3所示

图3 stm32的adc的结构框图

STM32的ADC是一种逐次比较型ADC,与ADC0809类似,在配置的时候主要完成以下工作:

(1)选定转换的通道

(2)选择触发源,可以由外设触发,也可以由软件触发

(3)配置ADC的时钟,决定转换的速度

(4)配置转换的模式,分为规则模式和注入模式

根据是否连续测量,是否多个通道扫描,工作可以分为:

连续 扫描

连续 不扫描

不连续 扫描

不连续 不扫描

在扫描模式下,多个通道的数据存到一个寄存器,后面的数据会把前面的数据覆盖掉,通常结合DMA使用, 并且在完成一次多通道扫描之后,才会把EOC标志位置1.

3.实验设计

利用STM32读取摇杆的值,显示到0.96OLED上,如图4所示

图4 实验现象

接线图:

摇杆 STM32

GND----------------- GND

+5v-------------------- +5v

VRx-------------------- PA0

VRy-------------------- PA1

在使用中分别用PA0,PA1引脚测量x, y方向的模拟电压量。

4. 实验程序

主程序:

cpp 复制代码
#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "AD.h"

uint16_t AD0, AD1, AD2, AD3;	//定义AD值变量

int main(void)
{
	/*模块初始化*/
	OLED_Init();				//OLED初始化
	AD_Init();					//AD初始化
	
	/*显示静态字符串*/
	OLED_ShowString(1, 1, "XX:");
	OLED_ShowString(2, 1, "YY:");
//
	
	
	
	while (1)
	{
		AD0 = AD_GetValue(ADC_Channel_0);		//单次启动ADC,转换通道0
		AD1 = AD_GetValue(ADC_Channel_1);		//单次启动ADC,转换通道1
//		AD2 = AD_GetValue(ADC_Channel_2);		//单次启动ADC,转换通道2
//		AD3 = AD_GetValue(ADC_Channel_3);		//单次启动ADC,转换通道3
		
		OLED_ShowNum(1, 5, AD1, 4);				//显示通道0的转换结果AD0
		OLED_ShowNum(2, 5, AD0, 4);				//显示通道1的转换结果AD1
//		OLED_ShowNum(3, 5, AD2, 4);				//显示通道2的转换结果AD2
//		OLED_ShowNum(4, 5, AD3, 4);				//显示通道3的转换结果AD3
		
		Delay_ms(100);			//延时100ms,手动增加一些转换的间隔时间
	}
}

ADC程序:

cpp 复制代码
/**
  * 函    数:AD初始化
  * 参    数:无
  * 返 回 值:无
  */
void AD_Init(void)
{
	/*开启时钟*/
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);	//开启ADC1的时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);	//开启GPIOA的时钟
	
	/*设置ADC时钟*/
	RCC_ADCCLKConfig(RCC_PCLK2_Div6);						//选择时钟6分频,ADCCLK = 72MHz / 6 = 12MHz
	
	/*GPIO初始化*/
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 ;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);					//将PA0、PA1、PA2和PA3引脚初始化为模拟输入
	
	/*不在此处配置规则组序列,而是在每次AD转换前配置,这样可以灵活更改AD转换的通道*/
	
	/*ADC初始化*/
	ADC_InitTypeDef ADC_InitStructure;						//定义结构体变量
	ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;		//模式,选择独立模式,即单独使用ADC1
	ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;	//数据对齐,选择右对齐
	ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;	//外部触发,使用软件触发,不需要外部触发
	ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;		//连续转换,失能,每转换一次规则组序列后停止
	ADC_InitStructure.ADC_ScanConvMode = DISABLE;			//扫描模式,失能,只转换规则组的序列1这一个位置
	ADC_InitStructure.ADC_NbrOfChannel = 1;					//通道数,为1,仅在扫描模式下,才需要指定大于1的数,在非扫描模式下,只能是1
	ADC_Init(ADC1, &ADC_InitStructure);						//将结构体变量交给ADC_Init,配置ADC1
	
	/*ADC使能*/
	ADC_Cmd(ADC1, ENABLE);									//使能ADC1,ADC开始运行
	
	/*ADC校准*/
	ADC_ResetCalibration(ADC1);								//固定流程,内部有电路会自动执行校准
	while (ADC_GetResetCalibrationStatus(ADC1) == SET);
	ADC_StartCalibration(ADC1);
	while (ADC_GetCalibrationStatus(ADC1) == SET);
}

/**
  * 函    数:获取AD转换的值
  * 参    数:ADC_Channel 指定AD转换的通道,范围:ADC_Channel_x,其中x可以是0/1/2/3
  * 返 回 值:AD转换的值,范围:0~4095
  */
uint16_t AD_GetValue(uint8_t ADC_Channel)
{
	ADC_RegularChannelConfig(ADC1, ADC_Channel, 1, ADC_SampleTime_55Cycles5);	//在每次转换前,根据函数形参灵活更改规则组的通道1
	ADC_SoftwareStartConvCmd(ADC1, ENABLE);					//软件触发AD转换一次
	while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);	//等待EOC标志位,即等待AD转换结束
	return ADC_GetConversionValue(ADC1);					//读数据寄存器,得到AD转换的结果
}
相关推荐
EVERSPIN3 小时前
国产MCU-灵动微MM32F0050系列微控制器的简单分享
单片机·微控制器·mm32f0050系列
huaijin6223 小时前
ESP32在arduino环境下的离线安装 -- 理论上多个版本都有效
stm32·单片机·嵌入式硬件
Shylock_Mister3 小时前
FreeRTOS事件组全解析:多任务同步核心技巧
c语言·单片机·物联网
三佛科技-134163842124 小时前
SI13213L/H,SI13215L/H 非隔离降压恒压芯片5V/3.3V典型应用资料
单片机·嵌入式硬件·智能家居·pcb工艺
云山工作室8 小时前
基于单片机的牧场奶牛养殖系统设计(论文+源码)
stm32·单片机·嵌入式硬件·毕业设计·毕设
三佛科技-134163842129 小时前
制冰机方案,家用制冰机MCU控制方案开发设计
单片机·嵌入式硬件·智能家居·pcb工艺
三佛科技-1873661339712 小时前
FT61F02X 10bit AD型8位MCU型号解析(程序储存器及脚位图介绍)
单片机·嵌入式硬件
费工不费解13 小时前
Arduino硬件原理3:核心单片机
单片机·嵌入式硬件
云数据构建师15 小时前
TB67S580FNG 芯片核心特点与应用概述
单片机·嵌入式硬件