历史上的今天
今天是:2024年09月03日(星期二)
2021年09月03日 | STM32—ADC多通道采集电压
2021-09-03 来源:eefocus
ADC详解
前面的博客中详细介绍了STM32中ADC的相关信息,这篇博客是对ADC内容的一个总结提升,ADC的详细介绍:ADC详解
程序说明
为了使这次代码阅读方便,博主没有在头文件中宏定义变量,都是直接采样库函数中的规定形参。此次采用多通道采集电压,使用ADC1的通道10、11、12、13、14、15一共六个通道,采用DMA将转换结果传输至内存。
函数主体
引脚配置
引脚配置的时候,将所有引脚一次性配置好,过于简单,不作详细说明。
void ADC_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AIN ;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0|
GPIO_Pin_1|
GPIO_Pin_2|
GPIO_Pin_3|
GPIO_Pin_4|
GPIO_Pin_5;
GPIO_Init(GPIOC , &GPIO_InitStruct);
}
ADC和DMA配置
此函数中主要配置了ADC的相关信息和DMA的信息。
uint16_t result[6]={0,0,0,0,0,0};
void ADC_DMA_COnfig(void)
{
ADC_InitTypeDef ADC_InitStructure;
DMA_InitTypeDef DMA_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
/* 复位DMA1的通道1 */
DMA_DeInit(DMA1_Channel1);
// 配置 DMA 初始化结构体
// 外设基址为:ADC 数据寄存器地址
DMA_InitStructure.DMA_PeripheralBaseAddr = ( u32 ) ( ADC1_BASE+0x4c);
// 存储器地址
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)result;
// 数据源来自外设
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
// 缓冲区大小,应该等于数据目的地的大小
DMA_InitStructure.DMA_BufferSize = 6;
// 外设寄存器只有一个,地址不用递增
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
// 存储器地址递增
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 传输通道优先级为高,当使用一个DMA通道时,优先级设置不影响
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
// 禁止存储器到存储器模式,因为是从外设到存储器
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
// 初始化DMA
DMA_Init(DMA1_Channel1, &DMA_InitStructure);
// 使能 DMA 通道
DMA_Cmd(DMA1_Channel1 , ENABLE);
// ADC 模式配置
// 只使用一个ADC,属于单模式
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
// 扫描模式
ADC_InitStructure.ADC_ScanConvMode = ENABLE ;
// 连续转换模式
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
// 不用外部触发转换,软件开启即可
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
// 转换结果右对齐
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
// 转换通道个数
ADC_InitStructure.ADC_NbrOfChannel = 6;
// 初始化ADC
ADC_Init(ADC1, &ADC_InitStructure);
// 配置ADC时钟为PCLK2的8分频,即9MHz
RCC_ADCCLKConfig(RCC_PCLK2_Div8);
// 配置ADC 通道的转换顺序和采样时间
ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 1, ADC_SampleTime_55Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 2, ADC_SampleTime_55Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_12, 3, ADC_SampleTime_55Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_13, 4, ADC_SampleTime_55Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_14, 5, ADC_SampleTime_55Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_15, 6, ADC_SampleTime_55Cycles5);
// 使能ADC DMA 请求
ADC_DMACmd(ADC1, ENABLE);
// 开启ADC ,并开始转换
ADC_Cmd(ADC1, ENABLE);
// 初始化ADC 校准寄存器
ADC_ResetCalibration(ADC1);
// 等待校准寄存器初始化完成
while(ADC_GetResetCalibrationStatus(ADC1));
// ADC开始校准
ADC_StartCalibration(ADC1);
// 等待校准完成
while(ADC_GetCalibrationStatus(ADC1));
// 由于没有采用外部触发,所以使用软件触发ADC转换
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
函数开头定义了ADC和DMA的结构体变量,并且打开了俩个外设的时钟(DMA挂载在AHB总线上)。DMA模块可以参考之前写的博客:DMA
这次DMA传输是从外设到内存,直接从ADC的数据寄存器中取数据,然后传输到全局数组变量result中。剩下的都在函数中作了详细注解。
主函数
#include "stm32f10x.h"
#include "usart.h"
#include "adc.h"
extern uint16_t result[6];
float voltage[6];
void delay(void)
{
uint32_t k=0xffffff;
while(k--);
}
int main(void)
{
uint8_t n;
/* 配置串口 */
DEBUG_USART_Config();
/* 有关ADC的函数打包 */
ADCx_Init();
while(1)
{
for(n=0;n<6;n++)
{
/* 转换为实际电压 */
voltage[n]=(float) result[n]/4096*3.3;
printf("n通道%d的值为:%fVn",n,voltage[n]);
}
delay();
}
}
主函数中也有相应注解。
上一篇:STM32—SPI读写FLASH
下一篇:STM32—常用的几种伪指令宏
史海拾趣
|
美国国家半导体公司宣布推出一款新的脉冲宽度调制(PWM)降压控制器,其特点是采用美国国家半导体独有的仿电流模式(ECM)结构,确保输出电压时占空比可以降至最低,而开关频率可以高达1.5MHz。 这款型号为LM3495的降压控制器可为ASIC、FPGA、数字信号 ...… 查看全部问答> |
|
2.4 TI浮点DSP芯片 2.4.1 TMS320C3X TMS320C3X是TI的第三代产品,也是第一代浮点DSP芯片。TMS320C3X中目前具有TMS320C 30、TMS320C31和TMS320C32三种。TMS320C31是TMS320C30的简化和改进型,它在TMS320 C30的基础上去掉了一般用户不常用的 ...… 查看全部问答> |
|
为何在数字信号处理系统价格如此低廉而且功能如此强大时,仍推荐模拟信号处理? 解答:因为有些时候模拟信号处理价格甚至更为低廉,而且可以完成数字信号处理不能完成的功能。模拟信号处理电路的销量可以证明这种说法。 伦敦南肯辛顿(South Kensington)科学博物馆建于维多利亚女王统治时期。尽管它运行良好而且很值得参 ...… 查看全部问答> |
|
本帖最后由 paulhyde 于 2014-9-15 09:01 编辑 QQ号:89212186 集各省高手,猜09赛题! 大家抓紧时间,多多交流,争取缩小赛题! … 查看全部问答> |
|
89年毕业,国企4年,民企2年,港企7年,意企5年,日韩合资企业2年,经历非标设备、玩具、电子、自动化设备行业。 在珠三角亲历了“中国制造”的繁荣壮大,也感受到目前金融海啸带来的凛冽气息,对“中国制造”有一些管窥之见,结合本人的经历,在 ...… 查看全部问答> |
|
摘自:arm linux fpga 嵌入0群 49900581(超级群) 群主在坛子里ID:wangkj wangkj:32. 如何用 diff 及其他工具写一个版本控制系统?(要有 check in, check out, file lock .. 等功能) 先知_找到了:不是都有免费 ...… 查看全部问答> |
|
请教各位: 在正常情况下,手按住触摸屏会出现一个小圆圈,然后弹出菜单:图标排列方式、刷新、粘贴、新建文件夹、属性等 类似鼠标右键功能 但是我的PDA用一段时间后就没有这个功能了,长按触摸屏,相当于只按左键,并不弹出菜单 ...… 查看全部问答> |
|
vxworks5.5是否对PCI Express能够支持? 还是只要BSP中对其支持就可以了? 刚学VxWorks不是很长时间,对很多问题不是很清楚,希望各位能够帮我解答这个问题,还有就是在VxWorks下写PCI Express设备的驱动与PCI设备的驱动区别大吗?… 查看全部问答> |
|
我现在有两个电路模块,需要互相通信,数据量少,采用类似485的通信就可以了。但是我想用通信线由其中的一块电路板给另外电路板供电,即两根线既用来通信又做电源线,请问大家有做个类似项目的吗?给点思路啊。谢谢!… 查看全部问答> |




