STM32 | ADC+RS485编写代码,实现光敏电阻控制灯的亮度
点击上方"蓝字"关注我们
01、ADC概述
ADC, Analog-to-Digital Converter的缩写,指模/数转换器或者模拟/数字转换器。是指将连续变量的模拟信号转换为离散的数字信号的器件。真实世界的模拟信号.例如温度、压力、声音或者图像等,需要转换成更容易储存、处理和发射的数字形式。模/数转换器可以实现这个功能,在各种不同的产品中都可以找到它的身影。
模拟信号:是指用连续变化的物理量表示的信息,其信号的幅度,或频率,或相位随时间作连续变化,或在一段连续的时间间隔内,其代表信息的特征量可以在任意瞬间呈现为任意数值的信号。
数字信号:指自变量是离散的、因变量也是离散的信号,这种信号的自变量用整数表示,因变量用有限数字中的一个数字来表示。在计算机中,数字信号的大小常用有限位的二进制数表示。
ADC转换步骤
1、采样:在时间轴上对信号数字化。也就是,按照固定的时间间隔抽取模拟信号的值,这样,采样后就可以使一个时间连续的信息波变为在时间上取值数目有限的离散信号。
2、量化:在幅度轴上对信号数字化。也就是,用有限个幅度值近似还原原来连续变化的幅度值,把模拟信号的连续幅度变为有限数量的有一定间隔的离散值。
3、编码:用二进制数表示每个采样的量化值(十进制数)。
02、ADC
STM32F407ZET6有3个ADC,每个ADC有12位、10位、8位和6位可选,每个ADC有16个外部通道。另外还有两个内部ADC源和VBAT通道挂在ADC1上。ADC具有独立模式、双重模式和三重模式,对于不同AD转换要求几乎都有合适的模式可选。ADC功能非常强大,具体的我们在功能框图中分析每个部分的功能。
ADC框架
规则通道
规则通道:顾名思意,规则通道就是很规矩的意思,我们平时一般使用的就是这个通道,或者应该说我们用到的都是这个通道,没有什么特别要注意的可讲。
注入通道
注入,可以理解为插入,插队的意思,是一种不安分的通道。它是一种在规则通道转换的时候强行插入要转换的一种。如果在规则通道转换过程中,有注入通道插队,那么就要先转换完注入通道,等注入通道转换完成后,再回到规则通道的转换流程。这点跟中断程序很像,都是不安分的主。所以,注入通道只有在规则通道存在时才会出现。
规则序列
规则序列寄存器有3个,分别为SQR3、SQR2、SQR1。SQR3控制着规则序列中的第一个到第六个转换,对应的位为:SQ1[4:0]~SQ6[4:0],第一次转换的是位4:0 SQ1[4:0],如果通道16想第一次转换,那么在SQ1[4:0]写16即可。SQR2控制着规则序列中的第7到第12个转换,对应的位为:SQ7[4:0]~SQ12[4:0],如果通道1想第8个转换,则SQ8[4:0]写1即可。SQR1控制着规则序列中的第13到第16个转换,对应位为:SQ13[4:0]~SQ16[4:0],如果通道6想第10个转换,则SQ10[4:0]写6即可。具体使用多少个通道,由SQR1的位L[3:0]决定,最多16个通道。
03、ADC采集步骤过程
ADC采集需要添加的库函数文件:stm32f4xx_adc.c
(1)理解电路原理图
可调电阻连接在PA5
ADC12_IN5
(2)、开启PA口时钟和ADC1时钟,设置PA5为模拟输入。
RCC_AHB1PeriphClockCmd (RCC_AHB1Periph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
GPIO_Init();
3)、初始化ADC_CCR寄存器。
ADC_CommonInit();
(4)、初始化ADC1参数,设置ADC1的工作模式以及规则序列的相关信息。
void ADC_Init(ADC_TypeDef* ADCx, ADC_InitTypeDef* ADC_InitStruct);
(5)、使能ADC。
ADC_Cmd(ADC1, ENABLE);
(6)、配置规则通道参数:
ADC_RegularChannelConfig();
(7)、开启软件转换:ADC_SoftwareStartConv(ADC1);
(8)、等待转换完成,读取ADC值。
ADC_GetConversionValue(ADC1);
04、RS485
1、RS485概述
485接口
485(一般称作RS485/EIA-485)是隶属于OSI模型物理层的电气特性规定为2线,半双工,多点通信的标准。它的电气特性和RS-232大不一样。用缆线两端的电压差值来表示传递信号。RS485仅仅规定了接受端和发送端的电气特性。它没有规定或推荐任何数据协议。
RS485推荐使用在点对点网络中,线型,总线型,不能是星型,环型网络。理想情况下RS485需要2个匹配电阻,其阻值要求等于传输电缆的特性阻抗(一般为120Ω)。没有特性阻抗的话,当所有的设备都静止或者没有能量的时候就会产生噪声,而且线移需要双端的电压差。没有终接电阻的话,会使得较快速的发送端产生多个数据信号的边缘,导致数据传输出错。
485推荐的连接方式:
简单地说,RS-232与RS-485的区别在于:传输方式不同、传输距离不同、RS-232 只允许一对一通信。
1、传输方式不同。RS-232采取不平衡传输方式,即所谓单端通讯(一条线传输一位数据). 而RS485则采用平衡传输,即差分传输方式(两条线决定一位数据)。
2、传输距离不同。RS-232适合本地设备之间的通信,传输距离一般不超过20m。而RS-485的传输距离为几十米到上千米。
3、RS-232 只允许一对一通信,而RS-485 接口在总线上是允许连接多达128个收发器。
05、RS485配置流程
RS485配置流程实际就是USART2的配置流程,这个流程可参考第六天USART1编程即可。在配置流程当中注意要配置RS485控制模式PG8为输出模式。
STM32 | 通用同步/异步串行接收/发送器USART带蓝牙(第六天) |
STM32 | USART实战案例 |
STM32 | USART1电脑串口助手发送字符串,控制开发板LED灯案例 |
USART通用同步/异步收发器 |
/**
* @brief Initializes the ADCs peripherals according to the specified parameters
* in the ADC_CommonInitStruct.
* @param ADC_CommonInitStruct: pointer to an ADC_CommonInitTypeDef structure
* that contains the configuration information for All ADCs peripherals.
* @retval None
*/
void ADC_CommonInit(ADC_CommonInitTypeDef* ADC_CommonInitStruct);
函数说明:初始化ADC_CCR寄存器
返回值:无
ADC_CommonInitTypeDef结构体
ADC除了有ADC_InitTypeDef初始化结构体外,还有一个ADC_CommonInitTypeDef通用初始化结构体。ADC_CommonInitTypeDef结构体内容决定三个ADC共用的工作环境,比如模式选择、ADC时钟等等。
ADC_CommonInitTypeDef结构体也是定义在stm32_f4xx.h文件中,具体定义如下:
typedef struct {
uint32_t ADC_Mode; //ADC模式选择
uint32_t ADC_Prescaler; //ADC分频系数
uint32_t ADC_DMAAccessMode; //DMA模式配置
uint32_t ADC_TwoSamplingDelay; //采样延迟
} ADC_InitTypeDef;
ADC_Mode:ADC工作模式选择,有独立模式、双重模式以及三重模式。
/**
* @brief Initializes the ADCx peripheral according to the specified parameters
* in the ADC_InitStruct.
* @note This function is used to configure the global features of the ADC (
* Resolution and Data Alignment), however, the rest of the configuration
* parameters are specific to the regular channels group (scan mode
* activation, continuous mode activation, External trigger source and
* edge, number of conversion in the regular channels group sequencer).
* @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral.
* @param ADC_InitStruct: pointer to an ADC_InitTypeDef structure that contains
* the configuration information for the specified ADC peripheral.
* @retval None
*/
void ADC_Init(ADC_TypeDef* ADCx, ADC_InitTypeDef* ADC_InitStruct);
函数说明:初始化ADC_CCR寄存器
返回值:无
ADC_TypeDef* ADCx:哪个ADC外设
ADC_InitTypeDef结构体
ADC_InitTypeDef结构体定义在stm32f4xx_adc.h文件内,具体定义如下:
typedef struct {
uint32_t ADC_Resolution; //ADC分辨率选择
Fu