stm32 ADC学习
stm32 ADC学习
·
目录
stm32 ADC学习
一、ADC模数转换器
1)ADC基础知识
- ADC (Analog-Digital Converter)模拟-数字转换器可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量,建立模拟电路到数字电路的桥梁
- 拥有12位逐次逼近型ADC,1us转换时间
- 输入电压范围03.3V,转换结果04095
- 拥有18个输入通道,可测量16个外部和2个内部信号源
- 拥有规则组和注入组两个转换单元
- 拥有模拟看门狗自动检测输入电压范围
- STM32F103C8T6的ADC资源:ADC1,ADC2,10个外部通道


图1-2 ADC基础结构
- 了解双ADC模式,转换和扫描模式,数据对齐(一般右对齐)
图3 ADC转换模式

图4 数据对齐方式
2)ADC转换
- ADC转换的步骤:采样,保持,量化,编码
- ADC的总转换时间 = 采样时间 + 12.5个ADC周期
- 当ADCCLK=14MHz时,采样时间为1.5个ADC周期,也就是1us
- ADC有一个内置校准模式,建议每次上电之后进行一次校准

图5 硬件电路
二、DMA直接存储器访问
1)DMA基础知识
- DMA(Direct Memory Access) 直接存储器存取
- 可以提供外设存储器或两存储器之间的高速传输,无需CPU干预
- 拥有12个独立可配置通道DMA1有七个,DMA2有五个,每个通道都支持软件触发和特定的硬件触发
- STM32F103C8T6的DMA资源只有DMA1七个

图5 DMA基本结构
2)存储器映像
- ROM是只读存储器,一般从RAM中存取数据

图6存储器映像
三、实验
1)AD单通道
常用函数:
// 初始化ADC
void RCC_ADCCLKConfig(uint32_t RCC_PCLK2);
void ADC_Init(ADC_TypeDef* ADCx, ADC_InitTypeDef* ADC_InitStruct);
void ADC_StructInit(ADC_InitTypeDef* ADC_InitStruct);
void ADC_Cmd(ADC_TypeDef* ADCx, FunctionalState NewState);
// 四个ADC校准函数
void ADC_ResetCalibration(ADC_TypeDef* ADCx);
FlagStatus ADC_GetResetCalibrationStatus(ADC_TypeDef* ADCx);
void ADC_StartCalibration(ADC_TypeDef* ADCx);
FlagStatus ADC_GetCalibrationStatus(ADC_TypeDef* ADCx);
// 配置ADC通道
void ADC_RegularChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime); //填充菜单
// 获取AD值
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC);
ADC_GetConversionValue(ADC1);

2)AD多通道

3)DMA数据转运
常用函数
void DMA_DeInit(DMA_Channel_TypeDef* DMAy_Channelx); //恢复缺省配置
void DMA_Init(DMA_Channel_TypeDef* DMAy_Channelx, DMA_InitTypeDef* DMA_InitStruct); //初始化
void DMA_StructInit(DMA_InitTypeDef* DMA_InitStruct); //初始化
void DMA_Cmd(DMA_Channel_TypeDef* DMAy_Channelx, FunctionalState NewState); //启动
void DMA_ITConfig(DMA_Channel_TypeDef* DMAy_Channelx, uint32_t DMA_IT, FunctionalState NewState); //配置中断
void DMA_SetCurrDataCounter(DMA_Channel_TypeDef* DMAy_Channelx, uint16_t DataNumber); //DMA设置当前寄存器
uint16_t DMA_GetCurrDataCounter(DMA_Channel_TypeDef* DMAy_Channelx); //DMA获取当前寄存器
FlagStatus DMA_GetFlagStatus(uint32_t DMAy_FLAG); //标志位
void DMA_ClearFlag(uint32_t DMAy_FLAG);
ITStatus DMA_GetITStatus(uint32_t DMAy_IT); //中断
void DMA_ClearITPendingBit(uint32_t DMAy_IT);

4)DMA+AD多通道
常用代码:
ADC_DMACmd(ADC1, ENABLE);

附学习参考网址
更多推荐



所有评论(0)