STM32的ADC1和ADC2同时运用夸张手法的成语

经典_STM32_ADC多通道采样的例子
STM32 ADC多通道转换
描述:用ADC连续采集11路模拟信号,并由DMA传输到内存。ADC配置为扫描并且连续转换模式,ADC的时钟配置为12MHZ。在每次转换结束后,由DMA循环将转换的数据传输到内存中。ADC可以连续采集N次求平均值。最后通过串口传输出最后转换的结果。
程序如下:
#i nclude "stm32f10x.h" //这个头文件包括STM32F10x所有外围寄存器、位、内存映射的定义
#i nclude "eval.h" //头文件(包括串口、按键、LED的函数声明)
#i nclude "SysTickDelay.h"
#i nclude "UART_INTERFACE.h"
#i nclude &stdio.h&
#define N 50 //每通道采50次
#define M 12 //为12个通道
vu16 AD_Value[N][M]; //用来存放ADC转换结果,也是DMA的目标地址
vu16 After_filter[M]; //用来存放求平均值之后的结果
void GPIO_Configuration(void)
GPIO_InitTypeDef GPIO_InitS
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
//因为USART1管脚是以复用的形式接到GPIO口上的,所以使用复用推挽式输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//PA0/1/2 作为模拟通道输入引脚
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|
GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模拟输入引脚
GPIO_Init(GPIOA, &GPIO_InitStructure);
//PB0/1 作为模拟通道输入引脚
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模拟输入引脚
GPIO_Init(GPIOB, &GPIO_InitStructure);
//PC0/1/2/3/4/5 作为模拟通道输入引脚
GPIO_InitStructure.GPIO_Pin =
GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模拟输入引脚
GPIO_Init(GPIOC, &GPIO_InitStructure);
void RCC_Configuration(void)
ErrorStatus HSEStartUpS
RCC_DeInit(); //RCC 系统复位
RCC_HSEConfig(RCC_HSE_ON); //开启HSE
HSEStartUpStatus = RCC_WaitForHSEStartUp(); //等待HSE准备好
if(HSEStartUpStatus == SUCCESS)
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //Enable
Prefetch Buffer
FLASH_SetLatency(FLASH_Latency_2); //Set 2 Latency cycles
RCC_HCLKConfig(RCC_SYSCLK_Div1); //AHB clock = SYSCLK
RCC_PCLK2Config(RCC_HCLK_Div1); //APB2 clock = HCLK
RCC_PCLK1Config(RCC_HCLK_Div2); //APB1 clock = HCLK/2
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_6); //PLLCLK =
12MHz * 6 = 72 MHz
RCC_PLLCmd(ENABLE); //Enable PLL
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); //Wait till PLL
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //Select PLL as system
clock source
while(RCC_GetSYSCLKSource() != 0x08); //Wait till PLL is used as
system clock source
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB
| RCC_APB2Periph_GPIOC |RCC_APB2Periph_ADC1 | RCC_APB2Periph_AFIO
|RCC_APB2Periph_USART1, ENABLE ); //使能ADC1通道时钟,各个管脚时钟
RCC_ADCCLKConfig(RCC_PCLK2_Div6); //72M/6=12,ADC最大时间不能超过14M
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); //使能DMA传输
void ADC1_Configuration(void)
ADC_InitTypeDef ADC_InitS
ADC_DeInit(ADC1); //将外设 ADC1 的全部寄存器重设为缺省值
ADC_InitStructure.ADC_Mode = ADC_Mode_I
//ADC工作模式:ADC1和ADC2工作在独立模式
ADC_InitStructure.ADC_ScanConvMode =ENABLE; //模数转换工作在扫描模式
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
//模数转换工作在连续转换模式
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_N
//外部触发转换关闭
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_R
//ADC数据右对齐
ADC_InitStructure.ADC_NbrOfChannel = M; //顺序进行规则转换的ADC通道的数目
ADC_Init(ADC1, &ADC_InitStructure);
//根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器
//设置指定ADC的规则组通道,设置它们的转化顺序和采样时间
//ADC1,ADC通道x,规则采样顺序值为y,采样时间为239.5周期
ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1,
ADC_SampleTime_239Cycles5 );
ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 2,
ADC_SampleTime_239Cycles5 );
ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 3,
ADC_SampleTime_239Cycles5 );
ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 4,
ADC_SampleTime_239Cycles5 );
ADC_RegularChannelConfig(ADC1, ADC_Channel_8, 5,
ADC_SampleTime_239Cycles5 );
ADC_RegularChannelConfig(ADC1, ADC_Channel_9, 6,
ADC_SampleTime_239Cycles5 );
ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 7,
ADC_SampleTime_239Cycles5 );
ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 8,
ADC_SampleTime_239Cycles5 );
ADC_RegularChannelConfig(ADC1, ADC_Channel_12, 9,
ADC_SampleTime_239Cycles5 );
ADC_RegularChannelConfig(ADC1, ADC_Channel_13, 10,
ADC_SampleTime_239Cycles5 );
ADC_RegularChannelConfig(ADC1, ADC_Channel_14, 11,
ADC_SampleTime_239Cycles5 );
ADC_RegularChannelConfig(ADC1, ADC_Channel_15, 12,
ADC_SampleTime_239Cycles5 );
// 开启ADC的DMA支持(要实现DMA功能,还需独立配置DMA通道等参数)
ADC_DMACmd(ADC1, ENABLE);
ADC_Cmd(ADC1, ENABLE); //使能指定的ADC1
ADC_ResetCalibration(ADC1); //复位指定的ADC1的校准寄存器
while(ADC_GetResetCalibrationStatus(ADC1));
//获取ADC1复位校准寄存器的状态,设置状态则等待
ADC_StartCalibration(ADC1); //开始指定ADC1的校准状态
while(ADC_GetCalibrationStatus(ADC1));
//获取指定ADC1的校准程序,设置状态则等待
void DMA_Configuration(void)
DMA_InitTypeDef DMA_InitS
DMA_DeInit(DMA1_Channel1); //将DMA的通道1寄存器重设为缺省值
DMA_InitStructure.DMA_PeripheralBaseAddr =
(u32)&ADC1-&DR; //DMA外设ADC基地址
DMA_InitStructure.DMA_MemoryBaseAddr =
(u32)&AD_V //DMA内存基地址
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
//内存作为数据传输的目的地
DMA_InitStructure.DMA_BufferSize = N*M; //DMA通道的DMA缓存的大小
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_D
//外设地址寄存器不变
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_E
//内存地址寄存器递增
DMA_InitStructure.DMA_PeripheralDataSize =
DMA_PeripheralDataSize_HalfW //数据宽度为16位
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfW
//数据宽度为16位
DMA_InitStructure.DMA_Mode = DMA_Mode_C //工作在循环缓存模式
DMA_InitStructure.DMA_Priority = DMA_Priority_H //DMA通道
x拥有高优先级
DMA_InitStructure.DMA_M2M = DMA_M2M_D
//DMA通道x没有设置为内存到内存传输
DMA_Init(DMA1_Channel1, &DMA_InitStructure);
//根据DMA_InitStruct中指定的参数初始化DMA的通道
//配置所有外设
void Init_All_Periph(void)
RCC_Configuration();
GPIO_Configuration();
ADC1_Configuration();
DMA_Configuration();
//USART1_Configuration();
USART_Configuration(9600);
u16 GetVolt(u16 advalue)
return (u16)(advalue * 330 / 4096); //求的结果扩大了100倍,方便下面求出小数
void filter(void)
int sum = 0;
for(i=0;i&12;i++)
for ( count=0;count&N;count++)
sum += AD_Value[count][i];
After_filter[i]=sum/N;
int main(void)
u16 value[M];
init_All_Periph();
SysTick_Initaize();
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
DMA_Cmd(DMA1_Channel1, ENABLE); //启动DMA通道
while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);//等待传输完成否则第一位数据容易丢失
for(i=0;i&12;i++)
value[i]= GetVolt(After_filter[i]);
printf("value[%d]:\t%d.%dv\n",i,value[i]/100,value[i]0) ;
delay_ms(100);
该程序中的两个宏定义,M和N,分别代表有多少个通道,每个通道转换多少次,可以修改其值。
曾出现的问题:配置时钟时要知道外部晶振是多少,以便准确配置时钟。将转换值由二进制转换为十进制时,要先扩大100倍,方便显示小数。最后串口输出时在
printf语句之前加这句代码,防止输出的第一位数据丢失:while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。查看: 3453|回复: 19
stm32 ADC 通道采样同时使用了ADC1的ch6,ch7和ADC3的ch6和ch7
主题帖子精华
中级会员, 积分 288, 距离下一级还需 212 积分
在线时间5 小时
请教下使用过的朋友:
& && && && && && && && &&&stm32F407ZGT6 ADC 通道采样同时使用了ADC1的ch6,ch7和ADC3的ch6和ch7。
1fe43c241839fadb3aaf07d7bad50617_41.jpg (0 Bytes, 下载次数: 0)
22:54 上传
主题帖子精华
金牌会员, 积分 1169, 距离下一级还需 1831 积分
在线时间6 小时
为什么&两个AD&&采集同样的通道呢
主题帖子精华
中级会员, 积分 288, 距离下一级还需 212 积分
在线时间5 小时
回复【2楼】tian123chi:
---------------------------------
当时没有注意,现在要使用了。哎&郁闷啊,不知道有补救措施没?
主题帖子精华
金牌会员, 积分 1169, 距离下一级还需 1831 积分
在线时间6 小时
回复【3楼】苹果:
---------------------------------
你的目的我还不知道呢
主题帖子精华
中级会员, 积分 288, 距离下一级还需 212 积分
在线时间5 小时
自己顶一下,&&
我现在说下我现在需要使用的情况,麻烦你给一点点建议:
我现在总共要使用8路ADC&其中5路是ADC3的ch4,ch5,ch6,ch7,ch8。然后两路是adc12的ch6和ch7.&最后还有一路(我对这路要求比较高。使用频率也比较高。我想配置成连读转换模式然后需要的时候我就去读那个寄存器)。
我现在自己的想法是:adc3的我用DMA1&ADC12的我用DMA2&然后最重要的我就配置成连续读取模式
然后需要的时候不断的读取
原子哥:可否帮忙推荐下最好的使用方式
主题帖子精华
金牌会员, 积分 1169, 距离下一级还需 1831 积分
在线时间6 小时
通道&6&7&为什么要两个AD采集?这个你还没说明白
主题帖子精华
中级会员, 积分 288, 距离下一级还需 212 积分
在线时间5 小时
回复【6楼】tian123chi:
---------------------------------
当时设计PCB的时候方便走线
主题帖子精华
金牌会员, 积分 1169, 距离下一级还需 1831 积分
在线时间6 小时
回复【7楼】苹果:
---------------------------------
那就ADC1&2不采集不就行了,反正3已经采集到了。或者ADC3采集&67,ADC1&2不采集!用一个ADC使用连续模式采集7路。那个重要的一路采用注入模式,需要数据的时候从注入数据寄存器中提取就行。
主题帖子精华
中级会员, 积分 288, 距离下一级还需 212 积分
在线时间5 小时
回复【8楼】tian123chi:
---------------------------------
没有明白你的意思,adc12&不采集&是什么意思?我这个pcb已经画好了
主题帖子精华
中级会员, 积分 288, 距离下一级还需 212 积分
在线时间5 小时
原子哥,没有空吗?帮忙指点下啊~~~~
主题帖子精华
金牌会员, 积分 1169, 距离下一级还需 1831 积分
在线时间6 小时
回复【9楼】苹果:
---------------------------------
ADC通道共用的&跟用哪个ADC有什么关系?只是我没了解你说的什么意思,还有原子对ADC研究的很浅
主题帖子精华
金钱124374
在线时间1040 小时
回复【11楼】tian123chi:
---------------------------------
确实用的少,呵呵.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺:
微信公众平台:正点原子& &
主题帖子精华
中级会员, 积分 288, 距离下一级还需 212 积分
在线时间5 小时
回复【11楼】tian123chi:
---------------------------------还没有明白吗?&我是担心出现datasheet里面的问题。我现在想用两个DMA,我现在使用的stm32型号是:stm32F407ZGT6.&&&&我不知道dma1可以配置给adc1&而dma2配置给adc3。这个dma是不是固定的配置给那个通道用?
主题帖子精华
金牌会员, 积分 1169, 距离下一级还需 1831 积分
在线时间6 小时
回复【13楼】苹果:
---------------------------------
DMA不是固定给某个通道的,DMA是连接到ADC的,只是把ADC数据寄存器的值转移到内存而已~
主题帖子精华
中级会员, 积分 288, 距离下一级还需 212 积分
在线时间5 小时
回复【14楼】tian123chi:
---------------------------------
其实就是简单点说;stm32F407&ADC1和ADC3可以共用一个DMA2吗?
主题帖子精华
金牌会员, 积分 1169, 距离下一级还需 1831 积分
在线时间6 小时
回复【15楼】苹果:
---------------------------------
懂的太少,没法说了,慢慢看数据手册吧,还有你这个中文版的是F103的,不是F407的,F407的框架和F103都有很多区别了,建议直接看F4数据手册!
主题帖子精华
中级会员, 积分 288, 距离下一级还需 212 积分
在线时间5 小时
回复【16楼】tian123chi:
---------------------------------
嗯,好的。但是项目交期也有点赶啊。而且是英文的。
主题帖子精华
中级会员, 积分 288, 距离下一级还需 212 积分
在线时间5 小时
回复【16楼】tian123chi:
---------------------------------
就我这个功能可以实现吗?
主题帖子精华
中级会员, 积分 288, 距离下一级还需 212 积分
在线时间5 小时
回复【16楼】tian123chi:
--------------------------------
看了datasheet这个问题解决了,谢谢了你的支持。
主题帖子精华
初级会员, 积分 72, 距离下一级还需 128 积分
在线时间0 小时
回复【19楼】苹果:
---------------------------------
请问如何解决的呀???
Powered by查看: 251|回复: 0
stm32 ADC可以同时测量多路源程序
stm32多路单片机源程序如下:
#include &led.h&
#include &delay.h&
#include &sys.h&
#include &usart.h&
#include &lcd.h&
#include &adc.h&
//ALIENTEK Mini STM32开发板范例代码15
//ADC实验 可以同时测量多路
//技术支持:曹鹏益
//广州市星翼电子科技有限公司
extern __IO uint16_t ADC_ConvertedValue[8];
& && & & &
int main(void)
& & & & u16 adcx,adcx1;
& & & &
& & & & delay_init();& & & && &&&& & & &&&//延时函数初始化& & & && &
& & & & uart_init(9600);& & & &&&& & & & //串口初始化为9600
& & & & LED_Init();& & & & & & & && && & & & & & & & //初始化与LED连接的硬件接口
& & & & LCD_Init();
& & & & Adc_Init();& & & & & & & && && & & & & & & & //ADC初始化& & & && &&&
& & & & POINT_COLOR=RED;//设置字体为红色
& & & & LCD_ShowString(60,50,200,16,16,&Mini STM32&);& & & &
& & & & LCD_ShowString(60,70,200,16,16,&ADC TEST&);& & & &
& & & & LCD_ShowString(60,90,200,16,16,&ATOM@ALIENTEK&);
& & & & LCD_ShowString(60,110,200,16,16,&&);& & & &
& & & & //显示提示信息
& & & & POINT_COLOR=BLUE;//设置字体为蓝色
& & & & LCD_ShowString(60,130,200,16,16,&ADC_CH1_VAL:&);& & & && && &
& & & & LCD_ShowString(60,150,200,16,16,&ADC_CH1_VOL:0.000V&);
&&LCD_ShowString(60,170,200,16,16,&ADC_CH2_VAL:&);& & & && && &
& & & & LCD_ShowString(60,190,200,16,16,&ADC_CH2_VOL:0.000V&);& & & &&&
& & & & while(1)
& & & & {
& & & & & & & & adcx=ADC_ConvertedValue[1]; // 读取转换的AD值
& & & & & & & & LCD_ShowxNum(156,130,adcx,4,16,0);//显示ADC的值
& & & & & & & & temp=(float)adcx*(3.3/4096);
& & & & & & & & adcx=
& & & & & & & & LCD_ShowxNum(156,150,adcx,1,16,0);//显示电压值
& & & & & & & & adcx1=ADC_ConvertedValue[2]; // 读取转换的AD值
& & & & & & & & LCD_ShowxNum(156,170,adcx1,4,16,0);//显示ADC的值
& & & & & & & & temp=(float)adcx1*(3.3/4096);
& & & & & & & & adcx1=
& & & & & & & & LCD_ShowxNum(156,190,adcx1,1,16,0);//显示电压值
& & & & }& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & && &&&
}& & & &
所有资料51hei提供下载:
(341.66 KB, 下载次数: 8)
23:29 上传
点击文件名下载附件
Powered bystm32f103 adc1 与DMA的结合方式应用实例
ADC1_Chanel0 0
ADC1_Chanel1 1
ADC1_Chanel2 2
ADC1_Chanel3 3
ADC1_Chanel4 4
ADC1_Chanel5 5
ADC1_Chanel6 6
ADC1_Chanel7 7
ADC1_Chanel8 8
ADC1_Chanel9 9
ADC1_Chanel10 10
ADC1_Chanel11 11
ADC1_Chanel12 12
ADC1_Chanel13 13
ADC1_Chanel14 14
ADC1_Chanel15 15
ADC1_Chanel16 16
//====AD开启通道个数======================
ADC_ENB_NUM
ADC_CYC_Cycles5
ADC_SampleTime_55Cycles5
//设置AD转换速率
uint16_t AD_Value[ADC_ENB_NUM] ; //DMA存储数据的区域
#define ADC1_DR_Address
((uint32_t)0x4001244C)
//ADC1数据寄存器的基地址
//*************************************
// 函数名称:ADC1_Config
// 函数功能:adc1 初始化配置
// 入口参数:无
// 出口参数:无
// 返 回 值:无
//***************************************/
void ADC1_Config(void)
ADC_InitTypeDef ADC_InitS
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 , ENABLE);
/* DMA1 channel1 configuration ----------------------------------------------*/
RCC_ADCCLKConfig(RCC_PCLK2_Div6) ; //ADC时钟分频 72/6 = 12M
/* ADC1 configuration ------------------------------------------------------*/
ADC_InitStructure.ADC_Mode = ADC_Mode_I //独立的转换模式
ADC_InitStructure.ADC_ScanConvMode = ENABLE;
//开启扫描模式
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
//开启连续转换模式
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_N //ADC外部开关,关闭状态
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_R
//对齐方式,ADC为12位中,右对齐方式
ADC_InitStructure.ADC_NbrOfChannel = ADC_ENB_NUM;
//开启通道数,1个
ADC_Init(ADC1, &ADC_InitStructure);
/* ADC1 regular channel9 configuration */
//ADC通道组,第9个通道 采样顺序1,转换时间
ADC_RegularChannelConfig(ADC1, ADC_Channel_9, 1, ADC_CYC_Cycles5);
// ADC_RegularChannelConfig(ADC1, ADC_Channel_8, 2, ADC_SampleTime_55Cycles5);
ADC_DMACmd(ADC1, ENABLE);
//ADC命令,使能
ADC_Cmd(ADC1, ENABLE);
//开启ADC1
ADC_ResetCalibration(ADC1);
//重新校准
while(ADC_GetResetCalibrationStatus(ADC1));
//等待重新校准完成
ADC_StartCalibration(ADC1);
//开始校准
while(ADC_GetCalibrationStatus(ADC1));
//等待校准完成
ADC_SoftwareStartConvCmd(ADC1, ENABLE); //连续转换开始,ADC通过DMA方式不断的更新RAM区。
ADC_TempSensorVrefintCmd(ENABLE);
//*************************************
// 函数名称:DMA_Config_ADC1
// 函数功能:DMA 初始化配置
// 入口参数:无
// 出口参数:无
// 返 回 值:无
//***************************************/
void DMA_Config_ADC1(void)
DMA_InitTypeDef DMA_InitS
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
//使能DMA时钟
DMA_DeInit(DMA1_Channel1);
//开启DMA1的第一通道
DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_A //DMA对应的外设基地址
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&AD_Value[0];//内存存储基地址 自己开僻的数组
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;//DMA的转换模式为SRC模式,由外设搬移到内存
DMA_InitStructure.DMA_BufferSize = Num_Adc_C //DMA缓存大小,N个
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_D //接收一次数据后,设备地址禁止后移
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_E //关闭接收一次数据后,目标内存地址后移
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfW
//定义外设数据宽度为16位
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfW
//DMA搬移数据尺寸,HalfWord就是为16位
DMA_InitStructure.DMA_Mode = DMA_Mode_C
//转换模式,循环缓存模式。
DMA_InitStructure.DMA_Priority = DMA_Priority_H //DMA优先级高
DMA_InitStructure.DMA_M2M = DMA_M2M_D
//M2M模式禁用
DMA_Init(DMA1_Channel1, &DMA_InitStructure);
/* Enable DMA1 channel1 */
DMA_Cmd(DMA1_Channel1, ENABLE);
//===ADC GPIO 初始化=======
void ADC1_GPIOInit(void)
//-----------PB---------------------------------
//VR 端口 PB1
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //50M时钟速度
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
//输入模式
GPIO_Init(GPIOB, &GPIO_InitStructure);
//====实例应用=======
//ADC1初始化设置
ADC1_GPIOInit() ;
ADC1_Config() ;
DMA_Config_ADC1() ; //dma设置
//--主程序-----
void mian(void)
while(!F_10MS);
F_10MS = 0 ;
Tmp = AD_Value[0] ; //在缓存区中 读取AD结果21ic官方微信-->
STM32的ADC1和ADC2的采集问题
中级技术员, 积分 145, 距离下一级还需 155 积分
中级技术员, 积分 145, 距离下一级还需 155 积分
中级技术员, 积分 145, 距离下一级还需 155 积分
中级技术员, 积分 145, 距离下一级还需 155 积分
试了一下STM32的ADC1和ADC2,调试时出现的问题让我不解:
(1)只使用STM32的ADC1采集信号,PA.0为其模拟输入通道;
将ADC1配置成独立模式、单通道单次转换、软件触发,
采集到的数据是正确的;
(2)只使用ADC2采集信号,与(1)中ADC1的设置完全相同,即
PA.0为其模拟输入通道;
将ADC2配置成横独立模式、单通道单次转换、软件触发,
却采集不到数据;
所以,想请教一个问题:
STM32的ADC2采集相较ADC1采集时,对ADC2的配置有什么特殊要求吗?
或者其ADC2只能在双AD模式中才能使用?
助理工程师, 积分 1723, 距离下一级还需 277 积分
助理工程师, 积分 1723, 距离下一级还需 277 积分
助理工程师, 积分 1723, 距离下一级还需 277 积分
助理工程师, 积分 1723, 距离下一级还需 277 积分
adc2试试看PA.1
助理工程师, 积分 1723, 距离下一级还需 277 积分
助理工程师, 积分 1723, 距离下一级还需 277 积分
助理工程师, 积分 1723, 距离下一级还需 277 积分
助理工程师, 积分 1723, 距离下一级还需 277 积分
应该都可以用, 但是adc精度那就呵呵了
中级技术员, 积分 145, 距离下一级还需 155 积分
中级技术员, 积分 145, 距离下一级还需 155 积分
中级技术员, 积分 145, 距离下一级还需 155 积分
中级技术员, 积分 145, 距离下一级还需 155 积分
adc2试试看PA.1
您好,试了一下PA.5,结果仍然是ADC1可以采,ADC2采不到
中级技术员, 积分 145, 距离下一级还需 155 积分
中级技术员, 积分 145, 距离下一级还需 155 积分
中级技术员, 积分 145, 距离下一级还需 155 积分
中级技术员, 积分 145, 距离下一级还需 155 积分
ADC1采集建立project1,ADC2采集建立project2针对ADC1:
& && && && && &PA.5作为模拟输入端
void Gpio_Init(void)
{
& & & & GPIO_InitTypeDef GPIO_InitS
& & & & RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE );
& & & & GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
& & & & GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;& & & & & & & & //模拟输入引脚
& & & & GPIO_Init(GPIOA, &GPIO_InitStructure);
}& & & & & & & & 复制代码针对ADC2:
& && && && &&&同样:PA.5作为模拟输入端
&font color=&#0000ff&&void Gpio_Init(void)
{
& & & &
& & & & GPIO_InitTypeDef GPIO_InitS
& & & & RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE );
& & & & GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
& & & & GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;& & & & & & & & //模拟输入引脚
& & & & GPIO_Init(GPIOA, &GPIO_InitStructure);
& & & &&&
}& & & & &/font&复制代码针对ADC1:
void&&Adc_Init(void)
{ & & & &
& & & & ADC_InitTypeDef ADC_InitS
& & & & RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 , ENABLE );
& & & & RCC_ADCCLKConfig(RCC_PCLK2_Div6);& &//72M/6=12,ADC最大时间不能超过14M
& & & &
& & & & ADC_DeInit(ADC1);
& & & & ADC_InitStructure.ADC_Mode = ADC_Mode_I& & & & //独立模式
& & & & ADC_InitStructure.ADC_ScanConvMode = DISABLE;& & & & //单通道
& & ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;& & & &&&//单次转换
& & & & ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_N& & & &
& & & & ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_R& & & &
& & & & ADC_InitStructure.ADC_NbrOfChannel = 1;&&
& & & & ADC_Init(ADC1, &ADC_InitStructure);& & & && &
& & ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 1, ADC_SampleTime_71Cycles5 );
& & & & ADC_Cmd(ADC1, ENABLE);
& & & & ADC_ResetCalibration(ADC1);
& & & & while(ADC_GetResetCalibrationStatus(ADC1));
& & & & ADC_StartCalibration(ADC1);
& & & & while(ADC_GetCalibrationStatus(ADC1));
}& & & &
复制代码针对ADC2:
&font color=&#0000ff&&void&&Adc_Init(void)
{ & & & &
& & & & ADC_InitTypeDef ADC_InitS
& & & & RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC2 , ENABLE );
& & & & RCC_ADCCLKConfig(RCC_PCLK2_Div6);& &//72M/6=12,ADC最大时间不能超过14M
& & & &
& & & & ADC_DeInit(ADC2);
& & & & ADC_InitStructure.ADC_Mode = ADC_Mode_I& & & & //独立模式
& & & & ADC_InitStructure.ADC_ScanConvMode = DISABLE;& & & & //单通道
& & ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;& & & &&&//单次转换
& & & & ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_N& &//软件启动
& & & & ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_R& & & &
& & & & ADC_InitStructure.ADC_NbrOfChannel = 1;& &
& & & & ADC_Init(ADC2, &ADC_InitStructure);& & & &&&
& & & & ADC_RegularChannelConfig(ADC2, ADC_Channel_5, 1, ADC_SampleTime_71Cycles5 );
& & & & ADC_Cmd(ADC2, ENABLE);& & & &
& & & & ADC_ResetCalibration(ADC2);
& & & & while(ADC_GetResetCalibrationStatus(ADC2));
& & & & ADC_StartCalibration(ADC2);
& & & & while(ADC_GetCalibrationStatus(ADC2));& & & &
}& & & & &/font&复制代码针对ADC1:
int main(void)
{
& && & & & SystemInit();& & & & & & & && &//系统时钟初始化
& & & & Gpio_Init();
& & & & Adc_Init();
& & & & while(1)
ADC_SoftwareStartConvCmd(ADC1, ENABLE );
}复制代码针对ADC2:
&font color=&#0000ff&&int main(void)
{
& && & & & SystemInit();& & & & & & & && &//系统时钟初始化
& & & & Gpio_Init();
& & & & Adc_Init();
& & & & while(1)
& & & & {
& & & & & & & &&&ADC_SoftwareStartConvCmd(ADC2, ENABLE );
& & & & }&/font&复制代码然后ADC1采集3.3V电压,此时DR为:0x0
& && && && && && && &&&3.3/2时,& && && &DR:0x07
& && && && && && && && && &&&0时,& && && &DR:0x0000.
但ADC2却采不到数据。
真的是奇了怪了
中级技术员, 积分 145, 距离下一级还需 155 积分
中级技术员, 积分 145, 距离下一级还需 155 积分
中级技术员, 积分 145, 距离下一级还需 155 积分
中级技术员, 积分 145, 距离下一级还需 155 积分
大家平常使用的一般都是ADC1,不论是单通道或多通道、软件触发或定时器中断触发。
而ADC是很少被单独使用的。
现在将程序呈上,希望有兴趣讨论的坛友可以帮忙运行一下,看看到底怎样。
我现在觉得,ADC2不能像ADC1那样单独使用,好像只能配合ADC1使用,比如双AD模式。
本帖子中包含更多资源
才可以下载或查看,没有帐号?
助理工程师, 积分 1723, 距离下一级还需 277 积分
助理工程师, 积分 1723, 距离下一级还需 277 积分
助理工程师, 积分 1723, 距离下一级还需 277 积分
助理工程师, 积分 1723, 距离下一级还需 277 积分
知道了, adc2时不要使用独占模式.
ADC2改用,中断采样试下;
什么型号的芯片啊
中级技术员, 积分 145, 距离下一级还需 155 积分
中级技术员, 积分 145, 距离下一级还需 155 积分
中级技术员, 积分 145, 距离下一级还需 155 积分
中级技术员, 积分 145, 距离下一级还需 155 积分
ADC2改用,中断采样试下;
什么型号的芯片啊
STM32F103VET6&&我试过中断:
ADC1独立模式、单通道单次转换,TIM2_CC2中断触发;
ADC2同样的配置:独立模式、单通道单次转换、TIM2_CC2中断触发;
结果仍然是:ADC1可采集,ADC2不能采集。
所以我认为:ADC2不能工作在单独模式,只能配合ADC1使用,即双AD模式
资深技术员, 积分 396, 距离下一级还需 104 积分
资深技术员, 积分 396, 距离下一级还需 104 积分
资深技术员, 积分 396, 距离下一级还需 104 积分
资深技术员, 积分 396, 距离下一级还需 104 积分
STM32F103VET6&&ADC2不能工作在单独模式 关注
中级技术员, 积分 145, 距离下一级还需 155 积分
中级技术员, 积分 145, 距离下一级还需 155 积分
中级技术员, 积分 145, 距离下一级还需 155 积分
中级技术员, 积分 145, 距离下一级还需 155 积分
STM32F103VET6&&ADC2不能工作在单独模式 关注
抱歉&&误导您了& &ADC1和ADC2是一样的& &都可以工作在独立模式
中级技术员, 积分 145, 距离下一级还需 155 积分
中级技术员, 积分 145, 距离下一级还需 155 积分
中级技术员, 积分 145, 距离下一级还需 155 积分
中级技术员, 积分 145, 距离下一级还需 155 积分
知道了, adc2时不要使用独占模式.
很抱歉& &有可能误导您了& &ADC2可以工作在独立模式的&&现在程序都是可行的
助理工程师, 积分 1723, 距离下一级还需 277 积分
助理工程师, 积分 1723, 距离下一级还需 277 积分
助理工程师, 积分 1723, 距离下一级还需 277 积分
助理工程师, 积分 1723, 距离下一级还需 277 积分
很抱歉& &有可能误导您了& &ADC2可以工作在独立模式的&&现在程序都是可行的 ...
规格书说的很清楚, 虽然最大是三路, 但是只有一个adc模块, 所以...
扫描二维码,随时随地手机跟帖
技术新星奖章
人才类勋章
时间类勋章
技术领袖奖章
人才类勋章
时间类勋章
坚毅之洋流
发帖类勋章
荣誉元老奖章
等级类勋章
您需要登录后才可以回帖
热门推荐 /4}

我要回帖

更多关于 党性分析是指运用党的 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信