目录
1、参考文献
《STM32F10X-中文参考手册》;
2、ADC简介
全称:analog to digital concerter;称为模/数转换器;
作用是:将连续变化的模拟信号转换为离散的数字信号;
3、STM32中的ADC
芯片型号不同,对应ADC的配置也不同;
3.1、电压输入
ADC供电要求:一般是3.3V;
Vref+:输入,模拟参考正极;
Vdda:输入,模拟电源;
Vref-:输入,模拟参考负极;
Vssa:输入,模拟电源地;
3.2、输入通道
对于STM32F103XE的ADC有18个通道;
其中外部的16个通道是:ADCX_IN0至ADCX_IN15;
这16个通道对应着不同的IO口;
3.3、规则通道
平时用的就是规则通道;
由寄存器SQR1、SQR2、SQR3控制着这16个通道的转换顺序,如下代码设置:
ADC_RegularChannelConfig(ADC1, ADC_Channel_13, 1, ADC_SampleTime_55Cycles5);
//通道13第一个进行转换;
下图中,IN13就是通道13;
4、触发源
一般都是连续的采样,用软件触发即可;相关代码如下:
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
//转换由软件控制而不是外部触发启动
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
//启动转换
5、转换时间
5.1、ADC时钟
ADC时钟,最大为14M,通常设置为12M;
下图分析可之前的文章:《STM32F10X_使用HSE配置系统时钟为72MHZ》;
5.2、采样时间
完成一次采样需要若干个ADC时钟,相关寄存器可查手册,相关代码如下:
ADC_RegularChannelConfig(ADC1, ADC_Channel_13, 1, ADC_SampleTime_55Cycles5);
//55.5个
转换时间 = 采样时间 + 12.5个周期;
12.5个周期是固定的;
举例:
ADC时钟频率:12MHZ;
ADC采样时间:55.5个周期;
转换时间:(55.5+12.5)*(1/12)= 5.7 us;
6、DMA运用于ADC
使用中断的话,浪费CPU资源;
DMA:直接存储器存储;
DMA作用:不停的读取数据,不给CPU造成压力,实现高速的采集;
相关代码如下:
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
//DMA1时钟
//DMA1通道1对应外设ADC1
DMA_DeInit(DMA1_Channel1);
//复位
DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;
//ADC外设地址
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADC_ConvertedValue[0];
//数据存放地址
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
//传输方向,注意从哪个到哪个
DMA_InitStructure.DMA_BufferSize = 14;
//通道数
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
//只有一个DMA外设
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
//内存地址需要递增
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
//半字
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
//半字
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
//循环,不要停
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(DMA1_Channel1, &DMA_InitStructure);
DMA_Cmd(DMA1_Channel1, ENABLE);
//使能
相关寄存器可查看手册;