打印
[其他ST产品]

STM32F1常用外设介绍

[复制链接]
楼主: 范德萨发额
手机看帖
扫描二维码
随时随地手机跟帖
161
范德萨发额|  楼主 | 2023-2-28 20:34 | 只看该作者 |只看大图 回帖奖励 |倒序浏览
硬件电路

使用特权

评论回复
162
范德萨发额|  楼主 | 2023-2-28 20:34 | 只看该作者
电位器的两个固定端,一端接3.3V,另一端接GND,这样中间的滑动端就可以输出一个0~3.3V可调的电压输出了,这里可以接ADC的输入通道例如PA0口,当滑动端往上滑时,电压增大,往下滑时,电压减小,电阻的阻值不能给太小,因为它是直接接在电源正负极上的,阻值太小,这个电阻就会很费电,再小可能就发热冒烟了,一般要接K欧级的电阻

中间是传感器输出电压的电路,一般来说,光敏电阻、热敏电阻、红外接收管、麦克风都可以等效为一个可变电阻,电阻阻值没法直接测量,可以通过和一个固定电阻串联分压,来得到一个反应电阻值电压的电路,传感器阻值变小,下拉作用变强,输出端电压就下降,传感器阻值变大时,下拉作用变弱,输出端受上拉电阻的作用,电压就会升高。固定电阻一般选择和传感器电阻相近的电容,这样可以得到一个位于中间电压区域比较好的输出

右边的电路是一个简单的电压转换电路,如果我想测量一个05V的VIN电压但是ADC只能接收03.3V的电压,那就可以搭建一个简易转换电路,使用电阻进行分压,上面阻值17K,下面组织33K,加一起是50K,中间的电压就是3.3V,就可以进入ADC转换了,这就是简单的电压转换电路

使用特权

评论回复
163
范德萨发额|  楼主 | 2023-2-28 20:34 | 只看该作者
ADC初始化步骤

使用特权

评论回复
164
范德萨发额|  楼主 | 2023-2-28 20:34 | 只看该作者
第一步,开启RCC时钟,包括ADC和GPIO的时钟,ADCCLK的分频器,也需要配置一下

第二步,配置GPIO,把需要用到的GPIO口配置成模拟输入的模式

第三步,配置多路开关,把左边的通道接入到右边的规则组列表中

第四步,配置ADC转换器,在库函数里,用结构体来配置,配置这一大块电路的参数

第五步,调用ADC_Cmd开启ADC,也可以进行一下校准,减小误差

使用特权

评论回复
165
范德萨发额|  楼主 | 2023-2-28 20:35 | 只看该作者
想要软件触发转换,会有函数可以触发,如果想读取结果也会有函数可以读取结果

使用特权

评论回复
166
范德萨发额|  楼主 | 2023-2-28 20:35 | 只看该作者
ADCCLK的配置函数

可以对APB2的72MHz时钟选择2、4、6、8分频,输入到ADCCLK

void RCC_ADCCLKConfig(uint32_t RCC_PCLK2)

使用特权

评论回复
167
范德萨发额|  楼主 | 2023-2-28 20:35 | 只看该作者
恢复缺省配置函数

void ADC_DeInit(ADC_TypeDef* ADCx);

使用特权

评论回复
168
范德萨发额|  楼主 | 2023-2-28 20:35 | 只看该作者
Init初始化函数

void ADC_Init(ADC_TypeDef* ADCx, ADC_InitTypeDef* ADC_InitStruct);

使用特权

评论回复
169
范德萨发额|  楼主 | 2023-2-28 20:35 | 只看该作者
StructInit结构体初始化函数

void ADC_StructInit(ADC_InitTypeDef* ADC_InitStruct);

使用特权

评论回复
170
范德萨发额|  楼主 | 2023-2-28 20:35 | 只看该作者
给ADC上电的函数

void ADC_Cmd(ADC_TypeDef* ADCx, FunctionalState NewState);

使用特权

评论回复
171
范德萨发额|  楼主 | 2023-2-28 20:35 | 只看该作者
开启DMA输出信号函数

使用DMA转运数据,就得调用这个函数

void ADC_DMACmd(ADC_TypeDef* ADCx, FunctionalState NewState);

使用特权

评论回复
172
范德萨发额|  楼主 | 2023-2-28 20:35 | 只看该作者
中断输出控制函数

void ADC_ITConfig(ADC_TypeDef* ADCx, uint16_t ADC_IT, FunctionalState NewState);

使用特权

评论回复
173
范德萨发额|  楼主 | 2023-2-28 20:35 | 只看该作者
复位校准函数

void ADC_ResetCalibration(ADC_TypeDef* ADCx);

使用特权

评论回复
174
范德萨发额|  楼主 | 2023-2-28 20:36 | 只看该作者
获取复位校准状态函数

FlagStatus ADC_GetResetCalibrationStatus(ADC_TypeDef* ADCx);

使用特权

评论回复
175
范德萨发额|  楼主 | 2023-2-28 20:36 | 只看该作者
开始校准函数

void ADC_StartCalibration(ADC_TypeDef* ADCx);

使用特权

评论回复
176
范德萨发额|  楼主 | 2023-2-28 20:36 | 只看该作者
获取开始校准状态函数

FlagStatus ADC_GetCalibrationStatus(ADC_TypeDef* ADCx);

使用特权

评论回复
177
范德萨发额|  楼主 | 2023-2-28 20:36 | 只看该作者
软件触发ADC的函数

void ADC_SoftwareStartConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState);

使用特权

评论回复
178
范德萨发额|  楼主 | 2023-2-28 20:36 | 只看该作者
ADC获取软件开始转换状态函数(没啥用)

获取CR2的SWSTART这一位,给SWTART置1,以开始转换,这个函数是返回SWSTART的状态,由于SWSTART位在转换开始后立刻就清0了,所以这个函数的返回值跟转换是否结束,毫无关系

FlagStatus ADC_GetSoftwareStartConvStatus(ADC_TypeDef* ADCx);

使用特权

评论回复
179
范德萨发额|  楼主 | 2023-2-28 20:36 | 只看该作者
获取转换是否结束函数

获取标志位状态,参数给EOC的标志位,判断EOC标志位是不是置1了,如果转换结束EOC标志位置1,然后调用此函数,判断标志位,来判断转换是否结束

FlagStatus ADC_GetFlagStatus(ADC_TypeDef* ADCx, uint8_t ADC_FLAG);

使用特权

评论回复
180
范德萨发额|  楼主 | 2023-2-28 20:36 | 只看该作者
配置间断模式函数

void ADC_DiscModeChannelCountConfig(ADC_TypeDef* ADCx, uint8_t Number);//每隔,几个通道间断一次
void ADC_DiscModeCmd(ADC_TypeDef* ADCx, FunctionalState NewState);//启用间断模式

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则