本人新手,最近想利用这块板子的ADC模块做东西,遇到几个问题:1、我查了一下STM32F103ZET6的数据手册,里面有ADC的具体输入信号的IO口,但是我发现其实有的ADC是共用一些IO口的,比如PC0,可以作为ADC123的通道10的模拟输入,比如PA4,可以作为ADC12的通道4的模拟输入,那这样的话,不就说明其实这块板子只能同时支持这么多路的ADC采样了吗?而并不是理论上的3个ADC乘以每个ADC的通道这么多路。
2、如果我想进行很多路的ADC采样,举个例子,30路,是不是STM32F103ZET6就无法实现了呢?用STM32F3或者STM32F4可以做到吗?
3、还有,如果我放弃了直接用STM32F103ZET6上面的IO口这种方式,而是用外接的一些ADC采样的模块,这样可以实现多路采样吗?各位能不能推荐一下这样的模块?
希望各位前辈高人不吝赐教,不胜感激。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
好久之前做的了,不太记得了,我发代码你自己研究下吧。
[mw_shl_code=c,true]#include "adc.h"
#include "delay.h"
/////////////////////////////////////////////////////////
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//ADC1的0通道--7通道测试
//作者;jia
//创建日期:2016年4月19日21:44:43
//部分程序引用@正点原子@开源网网友JJ
//对此程序如有疑问或建议,可发邮箱至 jiayubao12@163.com
//////////////////////////////////////////////////////////////////////////////////
//初始化ADC
//开启ADC1的通道,对应关系如下
//ADC1_CH0-->A0
//ADC1_CH1-->A1
//ADC1_CH2-->A2
//ADC1_CH3-->A3
//ADC1_CH4-->A4
//ADC1_CH5-->A5
//ADC1_CH6-->A6
//ADC1_CH7-->A7
//ADC1_CH8-->B0
//ADC1_CH9-->B1
//ADC1_CH10-->PC0
//ADC1_CH11-->PC1
//ADC1_CH12-->PC2
//ADC1_CH13-->PC3
//ADC1_CH14-->PC4
//ADC1_CH15-->PC5
void Adc_Init1(void)
{
ADC_InitTypeDef ADC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC | RCC_APB2Periph_ADC1,ENABLE); //使能ADC1通道时钟
RCC_ADCCLKConfig(RCC_PCLK2_Div6); //设置ADC分频因子6 72M/6=12,ADC最大时间不能超过14M
//PA0-7 作为模拟通道输入引脚
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模拟输入引脚
GPIO_Init(GPIOA, &GPIO_InitStructure);
//PB0-1 作为模拟通道输入引脚
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_Init(GPIOB, &GPIO_InitStructure);
//PC0-5 作为模拟通道输入引脚
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5;
GPIO_Init(GPIOC, &GPIO_InitStructure);
ADC_DeInit(ADC1); //复位ADC1
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //ADC工作模式:ADC1和ADC2工作在独立模式
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数据右对齐
ADC_InitStructure.ADC_NbrOfChannel = Channel_Num; //顺序进行规则转换的ADC通道的数目
ADC_Init(ADC1, &ADC_InitStructure); //根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器
ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_239Cycles5 ); //配置采样时间为239.5周期
ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 2, ADC_SampleTime_239Cycles5 ); //配置采样时间为239.5周期
ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 3, ADC_SampleTime_239Cycles5 ); //配置采样时间为239.5周期
ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 4, ADC_SampleTime_239Cycles5 ); //配置采样时间为239.5周期
ADC_RegularChannelConfig(ADC1, ADC_Channel_4, 5, ADC_SampleTime_239Cycles5 ); //配置采样时间为239.5周期
ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 6, ADC_SampleTime_239Cycles5 ); //配置采样时间为239.5周期
ADC_RegularChannelConfig(ADC1, ADC_Channel_6, 7, ADC_SampleTime_239Cycles5 ); //配置采样时间为239.5周期
ADC_RegularChannelConfig(ADC1, ADC_Channel_7, 8, ADC_SampleTime_239Cycles5 ); //配置采样时间为239.5周期
ADC_RegularChannelConfig(ADC1, ADC_Channel_8, 9, ADC_SampleTime_239Cycles5 ); //配置采样时间为239.5周期
//ADC_RegularChannelConfig(ADC1, ADC_Channel_9, 10, ADC_SampleTime_239Cycles5 ); //配置采样时间为239.5周期
ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 10, ADC_SampleTime_239Cycles5 ); //配置采样时间为239.5周期
ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 11, ADC_SampleTime_239Cycles5 ); //配置采样时间为239.5周期
ADC_RegularChannelConfig(ADC1, ADC_Channel_12, 12, ADC_SampleTime_239Cycles5 ); //配置采样时间为239.5周期
ADC_RegularChannelConfig(ADC1, ADC_Channel_13, 13, ADC_SampleTime_239Cycles5 ); //配置采样时间为239.5周期
ADC_RegularChannelConfig(ADC1, ADC_Channel_14, 14, ADC_SampleTime_239Cycles5 ); //配置采样时间为239.5周期
ADC_RegularChannelConfig(ADC1, ADC_Channel_15, 15, ADC_SampleTime_239Cycles5 ); //配置采样时间为239.5周期
ADC_Cmd(ADC1, ENABLE); //使能指定的ADC1
ADC_DMACmd(ADC1, ENABLE);//使能ADC1的DMA通道
ADC_ResetCalibration(ADC1); //使能复位校准
while(ADC_GetResetCalibrationStatus(ADC1)); //等待复位校准结束
ADC_StartCalibration(ADC1); //开启AD校准
while(ADC_GetCalibrationStatus(ADC1)); //等待校准结束
}
//ADC3_CH4-->PF6
//ADC3_CH5-->PF7
//ADC3_CH6-->PF8
//ADC3_CH7-->PF9
//ADC3_CH8-->PF10
void Adc_Init3(void)
{
ADC_InitTypeDef ADC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF|RCC_APB2Periph_ADC3,ENABLE); //使能ADC1通道时钟
RCC_ADCCLKConfig(RCC_PCLK2_Div6); //设置ADC分频因子6 72M/6=12,ADC最大时间不能超过14M
//PF6-10 作为模拟通道输入引脚
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模拟输入引脚
GPIO_Init(GPIOF, &GPIO_InitStructure);
ADC_DeInit(ADC3); //复位ADC1
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //ADC工作模式:ADC1和ADC2工作在独立模式
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数据右对齐
ADC_InitStructure.ADC_NbrOfChannel = Channel_Num1; //顺序进行规则转换的ADC通道的数目
ADC_Init(ADC3, &ADC_InitStructure); //根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器
ADC_RegularChannelConfig(ADC3, ADC_Channel_4, 1, ADC_SampleTime_239Cycles5 ); //配置采样时间为239.5周期
ADC_RegularChannelConfig(ADC3, ADC_Channel_5, 2, ADC_SampleTime_239Cycles5 ); //配置采样时间为239.5周期
ADC_RegularChannelConfig(ADC3, ADC_Channel_6, 3, ADC_SampleTime_239Cycles5 ); //配置采样时间为239.5周期
ADC_RegularChannelConfig(ADC3, ADC_Channel_7, 4, ADC_SampleTime_239Cycles5 ); //配置采样时间为239.5周期
ADC_RegularChannelConfig(ADC3, ADC_Channel_8, 5, ADC_SampleTime_239Cycles5 ); //配置采样时间为239.5周期
ADC_Cmd(ADC3, ENABLE); //使能指定的ADC1
ADC_DMACmd(ADC3, ENABLE);//使能ADC1的DMA通道
ADC_ResetCalibration(ADC3); //使能复位校准
while(ADC_GetResetCalibrationStatus(ADC3)); //等待复位校准结束
ADC_StartCalibration(ADC3); //开启AD校准
while(ADC_GetCalibrationStatus(ADC3)); //等待校准结束
}
[/mw_shl_code]
[mw_shl_code=c,true]#include "dma.h"
//DMA1的各通道配置
//这里的传输形式是固定的,这点要根据不同的情况来修改
//从外设模式->存储器/16位数据宽度/存储器增量模式
//DMA_CHxMA通道CHx //cpar:外设地址 //cmar:存储器地址//cndtr:数据传输量
void MYDMA_Config(DMA_Channel_TypeDef* DMA_CHx,u32 cpar,u32 cmar,u16 cndtr)
{
DMA_InitTypeDef DMA_InitStructure;
if((u32)DMA_CHx < 0x40020400)
{
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); //使能DMA1时钟
}
else
{
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE); //使能DMA2时钟
}
DMA_DeInit(DMA_CHx); //将DMA的通道1寄存器重设为缺省值
DMA_InitStructure.DMA_PeripheralBaseAddr = cpar; //DMA外设基地址
DMA_InitStructure.DMA_MemoryBaseAddr = cmar; //DMA内存基地址
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; //数据传输方向,从外设发送到内存 DMA_CCRX位4
DMA_InitStructure.DMA_BufferSize = cndtr; //DMA通道的DMA缓存的大小
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外设地址寄存器不变
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //内存地址寄存器递增
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; //外设数据宽度为16位
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; //内存数据宽度为16位
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; //工作在循环缓存模式
DMA_InitStructure.DMA_Priority = DMA_Priority_High; //DMA通道 x拥有高优先级
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //DMA通道x没有设置为内存到内存传输
DMA_Init(DMA_CHx, &DMA_InitStructure); //根据DMA_InitStruct中指定的参数初始化DMA的通道USART1_Tx_DMA_Channel所标识的寄存器
}
[/mw_shl_code]
一周热门 更多>