求助,关于STM32F072RBT6的ADC多通道抠图采集问题

查看: 1961|回复: 19
求助!STM32 ADC多通道采样的顺序出现异常问题。
如题,我最近用STM32F103 多通道AD采样,原先是三通道采样,我设置的ADC工作在连续转换的模式,那么也就是按照我设置的顺序依次每通道采样。
代码如下:
void&&Adc_Init()
{ & & & &
& & & & ADC_InitTypeDef ADC_InitS
& & & & GPIO_InitTypeDef GPIO_InitS
& & & &
& & & & ADC_DMAInit(); // ??AE?DMA
& & & & RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_ADC1,ENABLE );//u??>>? 1/2 ??????ADC1?¨u??±??
& & & & RCC_ADCCLKConfig(RCC_PCLK2_Div6);& &//u???? 1/2 ???è??·?AEu?ò×? ADC×??ó????14M 72/6=12M
& && && &
& & & & GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_4;& & & & //PA0/1/2/4 ×÷???????¨u??????? 1/2 ?& && && && && &
& & & & GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;& & & & & & & & //?????????? 1/2 ?
& & & & GPIO_Init(GPIOA, &GPIO_InitStructure);& & & &
& & & & ADC_DeInit(ADC1);&&// 1/2 <<???è ADC1 u??<<?? 1/4 ??aeAE÷???è???????u
& & & & ADC_InitStructure.ADC_Mode = ADC_Mode_I& & & & //ADC?¤×÷??? 1/2 :ADC1??ADC2?¤×÷????????? 1/2
& & & & ADC_InitStructure.ADC_ScanConvMode = ENABLE;& & & & //????×?>>>>?¤×÷???à?¨u???? 1/2
& & & & ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;& & & & //????×?>>>>?¤×÷??????×?>>>>??? 1/2
& & & & ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_N& & & & //×?>>>>???í 1/4 ????>>????????·?AE???
& & & & ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_R& & & & //ADC?? 3/4 ?????AE?
& & & & ADC_InitStructure.ADC_NbrOfChannel = 4;& & & & //???ò 1/2 ????ae?ò×?>>>>u?ADC?¨u?u?????
& & & & ADC_Init(ADC1, &ADC_InitStructure);& & & & //,ù 3/4 ?ADC_InitStruct& & & & ???,?¨u???????? 1/4 >>????èADCxu? 1/4 ??aeAE÷& &
&&& & & & //?è???,?¨ADCu??ae?ò×é?¨u????è???ü??u?×?>>????ò?????ù?± 1/4 ? ??AE?0 ?? 1 ,2?¨u?
& & & & ADC_RegularChannelConfig(ADC1,ADC_Channel_0,1,ADC_SampleTime_1Cycles5 );& & & & //Z?á?? 3/4 ?& & & && &&&
& & & & ADC_RegularChannelConfig(ADC1,ADC_Channel_1,2,ADC_SampleTime_1Cycles5 );& & & & //Y?á?? 3/4 ?& & & & & & & & & & & && &&&
& & & & ADC_RegularChannelConfig(ADC1,ADC_Channel_2,3,ADC_SampleTime_1Cycles5 );& & & & //X?á?? 3/4 ?
& & & & ADC_RegularChannelConfig(ADC1,ADC_Channel_4,4,ADC_SampleTime_1Cycles5 );& & & & //ADC1 4?¨u? ??u?>>úAE÷??Y?á?>>???? 3/4 ?
& & & & & & & &
& & & & ADC_DMACmd(ADC1,ENABLE);//??AE?ADC1u?DMA?<<??
& & & & ADC_Cmd(ADC1, ENABLE);& & & & //?????,?¨u?ADC1
& & & & ADC_ExternalTrigConvCmd(ADC1, DISABLE); // 1/2 ?????????·?ADC×?>>>>
& & & &
& & & & ADC_ResetCalibration(ADC1);& & & & //?????,?¨u?ADC1u???× 1/4
1/4 ??aeAE÷
& & & &&&
& & & & while(ADC_GetResetCalibrationStatus(ADC1));& & & & //>>???ADC1??????× 1/4
1/4 ??aeAE÷u?×???,?è??×????òu???
& & & &
& & & & ADC_StartCalibration(ADC1);& & & & & & & & //??? 1/4 ?,?¨ADC1u???× 1/4 ×???
& & & & while(ADC_GetCalibrationStatus(ADC1));& & & & & & & & //>>????,?¨ADC1u???× 1/4 ???ò,?è??×????òu???
& & & & ADC_SoftwareStartConvCmd(ADC1, ENABLE);& & & & & & & & //?????,?¨u?ADC1u??í 1/4 ?×?>>>>AE???????
& & & &
& & & & & & & &
//& & & & ADC_Cmd(ADC2, ENABLE);
}& & & & & & & & & & & & & & & &
ps: 这代码汉字乱码怎么解决啊?&&
三通道是没有问题,我设置了一个大小为30的数组a,也就是相当于按照通道顺序采样,分别往数组里面填写,传输的时候,我用了DMA,DMA buffsize为30,模式为循环模式,那么也就数据传输完成了之后,又从头开始传送。这些都没问题。现在的问题是我加了第四个通道,顺序设置的是4,这个时候传输的时候,顺序就出了问题。按理说,a[0]为规则组通道顺序1的数据,a[1]为规则组通道顺序2的数据,a[2]为规则组通道顺序3的数据,a[3]为规则组通道顺序4的数据, a[0]又为规则组通道顺序1的数据,依次循环才对。但是现在变成了&&a[0]为规则组通道顺序4的数据,a[1]为规则组通道顺序1的数据,a[2]为规则组通道顺序2的数据,a[3]为规则组通道顺序3的数据,a[4]又为规则组通道顺序4的数据,这不就顺序变了吗?
DMA部分代码:
void ADC_DMAInit(void)
{
& & & & DMA_InitTypeDef DMA_InitS
&&RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);//??AE?DMA?±??
&&DMA_DeInit(DMA1_Channel1); //,??>>DMA 1/4 ??aeAE÷u??u ????DMA?¨u?1
& & & &
&&DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&(ADC1-&DR);//?????èADC1u??? 3/4 ? 1/4 ??aeAE÷??>>ù× 1/4 u??·
&&DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&ADC1_D
&&DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;//DMA?<<??· 1/2 ?ò?????èu 1/2 ???ae
&&DMA_InitStructure.DMA_BufferSize = 40; //???±???<<??? 1/2 ,?· 1/2 ?òu?
&&DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_D//±??????èu??·?>>±???
&&DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_E//???aeu??·u???
&&DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfW
&&DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfW //16?>>??? 1/2
&&DMA_InitStructure.DMA_Mode = DMA_Mode_C //?->>·??? 1/2
&&DMA_InitStructure.DMA_Priority = DMA_Priority_H//,ss???? 1/4 ?????
&&DMA_InitStructure.DMA_M2M = DMA_M2M_D//·?M2M ?<<??
&&DMA_Init(DMA1_Channel1, &DMA_InitStructure);
& & & &
&&/* Enable DMA1 Channel1 */
&&DMA_Cmd(DMA1_Channel1, ENABLE);
}
复制代码
求教各位这个顺序为什么变了?
怒顶一个!!!!!!!!!
顶一下,没发现问题
顶一下,没发现问题
这样真的好吗?
#include &adc.h&& & & && &
volatile unsigned short ADC1_Data[40]={0};
void ADC_DMAInit(void)
{
& & & & DMA_InitTypeDef DMA_InitS
&&RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);//开启DMA时钟
&&DMA_DeInit(DMA1_Channel1); //复位DMA寄存器的值 选取DMA通道1
& & & &
&&DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&(ADC1-&DR);//取外设ADC1的数据寄存器为基准地址
&&DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&ADC1_D
&&DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;//DMA传输方向为外设到内存
&&DMA_InitStructure.DMA_BufferSize = 40; //暂时先传输两个方向的
&&DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_D//保持外设地址不变。
&&DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_E//内存地址递增
&&DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfW
&&DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfW //16位模式
&&DMA_InitStructure.DMA_Mode = DMA_Mode_C //循环模式
&&DMA_InitStructure.DMA_Priority = DMA_Priority_H//高优先级先行
&&DMA_InitStructure.DMA_M2M = DMA_M2M_D//非M2M 传输
&&DMA_Init(DMA1_Channel1, &DMA_InitStructure);
& & & &
&&/* Enable DMA1 Channel1 */
&&DMA_Cmd(DMA1_Channel1, ENABLE);
}
//初始化ADC
//这里我们仅以规则通道为例
//我们默认将开启通道0~4& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & && &
void&&Adc_Init()
{ & & & &
& & & & ADC_InitTypeDef ADC_InitS
& & & & GPIO_InitTypeDef GPIO_InitS
& & & &
& & & & ADC_DMAInit(); // 开启DMA
& & & & RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_ADC1,ENABLE );//第一步:使能ADC1通道时钟
& & & & RCC_ADCCLKConfig(RCC_PCLK2_Div6);& &//第二步:设置分频因子 ADC最大速率14M 72/6=12M
& && && &
& & & & GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_4;& & & & //PA0/1/2/4 作为模拟通道输入引脚& && && && && &
& & & & GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;& & & & & & & & //模拟输入引脚
& & & & GPIO_Init(GPIOA, &GPIO_InitStructure);& & & &
& & & & 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 = 4;& & & & //顺序进行规则转换的ADC通道的数目
& & & & ADC_Init(ADC1, &ADC_InitStructure);& & & & //根据ADC_InitStruct& & & & 中指定的参数初始化外设ADCx的寄存器& &
&&& & & & //设置指定ADC的规则组通道,设置它们的转化顺序和采样时间 开启0 和 1 ,2通道
& & & & ADC_RegularChannelConfig(ADC1,ADC_Channel_0,1,ADC_SampleTime_1Cycles5 );& & & & //Z轴数据& & & && &&&
& & & & ADC_RegularChannelConfig(ADC1,ADC_Channel_1,2,ADC_SampleTime_1Cycles5 );& & & & //Y轴数据& & & & & & & & & & & && &&&
& & & & ADC_RegularChannelConfig(ADC1,ADC_Channel_2,3,ADC_SampleTime_1Cycles5 );& & & & //X轴数据
& & & & ADC_RegularChannelConfig(ADC1,ADC_Channel_4,4,ADC_SampleTime_1Cycles5 );& & & & //ADC1 4通道 场地机器人Y轴位置数据
& & & & & & & &
& & & & ADC_DMACmd(ADC1,ENABLE);//开启ADC1的DMA传输
& & & & ADC_Cmd(ADC1, ENABLE);& & & & //使能指定的ADC1
& & & & ADC_ExternalTrigConvCmd(ADC1, DISABLE); //禁止外部出发ADC转换
& & & &
& & & & ADC_ResetCalibration(ADC1);& & & & //重置指定的ADC1的校准寄存器
& & & &&&
& & & & while(ADC_GetResetCalibrationStatus(ADC1));& & & & //获取ADC1重置校准寄存器的状态,设置状态则等待
& & & &
& & & & ADC_StartCalibration(ADC1);& & & & & & & & //开始指定ADC1的校准状态
& & & & while(ADC_GetCalibrationStatus(ADC1));& & & & & & & & //获取指定ADC1的校准程序,设置状态则等待
& & & & ADC_SoftwareStartConvCmd(ADC1, ENABLE);& & & & & & & & //使能指定的ADC1的软件转换启动功能
& & & &
& & & & & & & &
//& & & & ADC_Cmd(ADC2, ENABLE);
}& & & & & & & & & & & & & & & &
复制代码 好了&&这是完整配置代码。
在配置通道之前把使能关了就可以正常
试试下面方法
1工程清理一下,重新生成,
2,ADC先不要开启扫描模式,ADC的DMA在adc初始化代码最后打开。然后再开启扫描模式。
在配置通道之前把使能关了就可以正常
请问大神,是那个使能呢?
试试下面方法
1工程清理一下,重新生成,
2,ADC先不要开启扫描模式,ADC的DMA在adc初始化代码最后打开。然 ...
大哥好牛逼,我把DMA初始化改到最后,果然顺序就对了,但是没有搞懂这是为什么,求指教、
请问大神,是那个使能呢?
ADC_Cmd这个
ADC_Cmd这个
嗯呢。现在已经改好了,但是每个通道之间的采样值会影响这是咋回事呢,就是我改变其中一个通道的值,其他值也会变化,虽然不是很多,啊
大哥好牛逼,我把DMA初始化改到最后,果然顺序就对了,但是没有搞懂这是为什么,求指教、 ...
不知道,我也遇到过,就是按我写的那个步骤解决的,
(个人猜是DMA与ADC不同步导致的)
不知道,我也遇到过,就是按我写的那个步骤解决的,
(个人猜是DMA与ADC不同步导致的) ...
恩,现在已经改好了,但是每个通道之间的采样值会影响这是咋回事呢,就是我改变其中一个通道的值,其他某个通道的值也会变化,虽然不是很多,这种情况遇到过么?
恩,现在已经改好了,但是每个通道之间的采样值会影响这是咋回事呢,就是我改变其中一个通道的值,其他某 ...
没有,通道之间,间隔采一下地试试。
没有,通道之间,间隔采一下地试试。
怎么样间隔采一下地呢,
怎么样间隔采一下地呢,
ADC2的16,17通道是接地的。ADC1不是,搞错了。
恩,现在已经改好了,但是每个通道之间的采样值会影响这是咋回事呢,就是我改变其中一个通道的值,其他某 ...
采样速度降低一点试试.
采样速度降低一点试试.
我去试一下,我现在是以最短的采样周期采样的。当然也不排除硬件上的问题。
请问楼主,通道间相互影响的问题解决了吗? 是怎么解决的;
我现在也遇到了同样的问题
同样是互相干扰。打印在串口观察的
阿莫电子论坛, 原"中国电子开发网"查看: 14452|回复: 22
STM32 AD多通道不用DMA采集,查了很多都是独立单次采集,然后多次调用,希望大神分析下这样为什么不可以??
主题帖子精华
初级会员, 积分 67, 距离下一级还需 133 积分
在线时间1 小时
问下STM32多通道AD采集不用DMA,用多通道单次采集怎么发现数据很乱,求解。
代码如下:void
Adc_Init(void)
ADC_InitTypeDef ADC_InitS
GPIO_InitTypeDef GPIO_InitS
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC1 , ENABLE );
//使能ADC1通道时钟
RCC_ADCCLKConfig(RCC_PCLK2_Div6);
//72M/6=12,ADC最大时间不能超过14M
//PA0/1/2/3 作为模拟通道输入引脚
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);
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 = 4; //顺序进行规则转换的ADC通道的数目
ADC_Init(ADC1, &ADC_InitStructure); //根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器
ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_239Cycles5 ); //ADC1,ADC通道3,规则采样顺序值为1,采样时间为239.5周期
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_Cmd(ADC1, ENABLE); //使能指定的ADC1
ADC_ResetCalibration(ADC1); //重置指定的ADC1的校准寄存器
while(ADC_GetResetCalibrationStatus(ADC1)); //获取ADC1重置校准寄存器的状态,设置状态则等待
ADC_StartCalibration(ADC1);
//开始指定ADC1的校准状态
while(ADC_GetCalibrationStatus(ADC1));
//获取指定ADC1的校准程序,设置状态则等待
//ADC_SoftwareStartConvCmd(ADC1, ENABLE);
//使能指定的ADC1的软件转换启动功能
u16 ADC_CONVER(void)
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
//使能指定的ADC1的软件转换启动功能
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束
return ADC_GetConversionValue(ADC1); //返回最近一次ADC1规则组的转换结果
然后再main函数调用:
int main(void)
SystemInit();
delay_init(72);
//延时初始化
NVIC_Configuration();
uart_init(9600);
LED_Init();
KEY_Init();
LCD_Init();
Adc_Init();
POINT_COLOR=RED;//设置字体为红色
LCD_ShowString(60,50,"Mini STM32");
LCD_ShowString(60,70,"ADC TEST");
LCD_ShowString(60,90,"ATOM@ALIENTEK");
LCD_ShowString(60,110,"");
//显示提示信息
POINT_COLOR=BLUE;//设置字体为蓝色
LCD_ShowString(60,130,"ADC_CH0_VAL:");
LCD_ShowString(60,150,"ADC_CH0_VOL:0.000V");
adcx=ADC_CONVER();
LCD_ShowNum(156,130,adcx,4,16);//显示ADC的值
temp=(float)adcx*(3.3/4096);
LCD_ShowNum(156,150,adcx,1,16);//显示电压值
temp*=1000;
LCD_ShowNum(172,150,temp,3,16);
LED0=!LED0;
delay_ms(1000);
发现数据不是先PA0,PA1,PA2,PA3的AD值的顺序,第一个(复位后)屏幕显示是PA3采集的,其它的有点紊乱。
怎么回事,谢谢大哥与各位朋友。
主题帖子精华
新手上路, 积分 21, 距离下一级还需 29 积分
在线时间0 小时
回复【2楼】:
---------------------------------
多路采集,不用DMA?
主题帖子精华
在线时间84 小时
参考下这个代码...
21:25 上传
点击文件名下载附件
354.04 KB, 下载次数: 7075
博观而约取,厚积而薄发。
主题帖子精华
金钱113759
在线时间839 小时
回复【楼主位】小小飞行器:
---------------------------------&
没这么用过,你还不如用我们例程提供的方式,去做。要哪个通道,给哪个通道。
我是开源电子网站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺:
微信公众平台:正点原子& &
主题帖子精华
初级会员, 积分 67, 距离下一级还需 133 积分
在线时间1 小时
回复【2楼】:
---------------------------------
谢谢大哥,刚看完你的,是一路一路的采集,这样思维比较明显,谢谢你啊!&&&&
有空的话,你试试我上面的那样看看,我没调试成功,不知道Why,谢谢···
主题帖子精华
初级会员, 积分 67, 距离下一级还需 133 积分
在线时间1 小时
回复【3楼】正点原子:
--------------------------------
OK,原子哥,一楼的就是你的思路。&
你有空的话,按照我用的看看,我查了很多,不知道为什么不行才发帖的····
谢谢你
主题帖子精华
新手上路, 积分 34, 距离下一级还需 16 积分
在线时间1 小时
中文手册里说的:
当所有通道都转换完成之后,ADC_SR&EOC位才置1,所以当转换完成后ADC_DR寄存器的数据都是最后一个通道的数据。我是这么理解的。最好用哪个开哪个,
还有我觉得&val = ((temp*3300)/4095);
4095 更合适,但也有缺陷,就是运算速度不如
val = ((temp*3300)&&12);快
主题帖子精华
初级会员, 积分 67, 距离下一级还需 133 积分
在线时间1 小时
回复【3楼】正点原子:
---------------------------------
&好像&1楼的&也不对&&&&问一下原子哥&&我这边采集使用的AD不能&依次去采集,比如说采集220V的电压&&是&定是采集某一个通道的&这样切换怎么弄呢
没有解决不了的问题&只有不努力的笨蛋
主题帖子精华
初级会员, 积分 67, 距离下一级还需 133 积分
在线时间1 小时
回复【2楼】:
---------------------------------
你这个&貌似不行的&&&逐次
没有解决不了的问题&只有不努力的笨蛋
主题帖子精华
初级会员, 积分 84, 距离下一级还需 116 积分
在线时间7 小时
回复【2楼】:
---------------------------------
多谢&哈哈
主题帖子精华
新手上路, 积分 41, 距离下一级还需 9 积分
在线时间1 小时
回复【4楼】小小飞行器:
---------------------------------
他这个我的显示屏显示不出来,怎么回事
主题帖子精华
新手上路, 积分 41, 距离下一级还需 9 积分
在线时间1 小时
回复【3楼】正点原子:
---------------------------------
原子哥,例程就一个通道啊
主题帖子精华
新手上路, 积分 41, 距离下一级还需 9 积分
在线时间1 小时
回复【2楼】:
---------------------------------
你这个顺序是对了,可是为什么呢,还有一个问题就是,有几个通道,没有给采样信号显示屏显示都是v
主题帖子精华
新手上路, 积分 22, 距离下一级还需 28 积分
在线时间4 小时
同样想知道这个问题
主题帖子精华
新手上路, 积分 24, 距离下一级还需 26 积分
在线时间6 小时
ADC_InitStructure.ADC_ScanConvMode = ENABLE;扫描模式打开后,只有把规则通道里的4个转换都转换完才产生一个EOC,也就是说你采集的结果只能是PA3,其它的结果都是
主题帖子精华
新手上路, 积分 19, 距离下一级还需 31 积分
在线时间0 小时
参考下这个代码...
我参考你的部分程序,因为我只需要2路ad ,用的ADC1 CH1 和CH11 ,请问 :为什么CH11的值受CH1的影响啊?
经年殇莫离....
主题帖子精华
新手上路, 积分 20, 距离下一级还需 30 积分
在线时间3 小时
为啥开五路不行啊?????
主题帖子精华
初级会员, 积分 83, 距离下一级还需 117 积分
在线时间3 小时
学习了!非常感谢楼主!
做自己喜欢做的的事,爱自己所爱的人!
主题帖子精华
新手上路, 积分 10, 距离下一级还需 40 积分
在线时间1 小时
正在学习它。也是遇到这个问题。多通道不用DMA,只有一个通道有结果,用DMA,TMD,全部往后错一位。采集的时候 打开 DMA,用完AD数据再关闭DMA一样,往后错一位。好难用的芯片啊,怎么出厂的。
主题帖子精华
新手上路, 积分 37, 距离下一级还需 13 积分
在线时间9 小时
跟楼主一样,遇到同样的问题。。。 为什么不能按照下面这个函数设置的采样顺序逐次采样呢。。。同问
ADC_RegularChannelConfig(ADC1,ADC_Channel_3, 1,ADC_SampleTime_1Cycles5);
ADC_RegularChannelConfig(ADC1,ADC_Channel_2, 2,ADC_SampleTime_1Cycles5);
ADC_RegularChannelConfig(ADC1,ADC_Channel_5, 3,ADC_SampleTime_1Cycles5);
但是按照原子提供的例程的思路,就可以了。。
主题帖子精华
初级会员, 积分 177, 距离下一级还需 23 积分
在线时间1 小时
回复【4楼】小小飞行器:
---------------------------------
他这个我的显示屏显示不出来,怎么回事
板子的屏幕引脚不同,他的应该是战舰的
主题帖子精华
新手上路, 积分 8, 距离下一级还需 42 积分
在线时间0 小时
回复【楼主位】小小飞行器:
---------------------------------&
没这么用过,你还不如用我们例程提供 ...
但是你们提供的历程只能实现单通道的转换,
主题帖子精华
中级会员, 积分 324, 距离下一级还需 176 积分
在线时间56 小时
不知你的问题解决了没,我最近也在弄这个没有DMA的程序。
比你的还差,没数据。
如果你方便的话是否可以提供一个代码供我参考一下,非常感谢!!
如何拿下蒙住眼的树叶。
Powered by温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
有那么一天
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
& & & & &2.ADC_DR_ADDRESS,根据使用的ADC在参考手册中查找ADC_DR的地址值,例如ADC1_DR对应地址& & & & & & 0x4001204c,ADC2_DR对应地址0x4001214c。& & & & &3.ADC采集到的数据超过4096,设置的是数据右对齐格式,说明u16的高四位不是0,数据处理的过程中,将高四位数据清0:ADC_ConvertedValue&=0xfff;FY附上ADC1+DMA2_Channel0采集 循环采集10路AD数据的初始化程序:void ADCDri_Init(void){ GPIO_InitTypeDef GPIO_InitS ADC_InitTypeDef ADC_InitS ADC_CommonInitTypeDef ADC_CommonInitS
DMA_InitTypeDef DMA_InitS
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA|RCC_AHB1Periph_GPIOC,ENABLE);//
RCC_ADCCLKConfig(RCC_PCLK2_Div6);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE); GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ; GPIO_Init(GPIOA,&GPIO_InitStructure);
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_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ; GPIO_Init(GPIOC,&GPIO_InitStructure);
//DMA_DeInit(DMA2_Stream0); DMA_InitStructure.DMA_Channel=DMA_Channel_0;
DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_ADDRESS;
DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&ADCConvertedV
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToM
DMA_InitStructure.DMA_BufferSize = N*M;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_D
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_E
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfW
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfW
DMA_InitStructure.DMA_Mode = DMA_Mode_C
DMA_InitStructure.DMA_Priority = DMA_Priority_H DMA_InitStructure.DMA_FIFOMode= DMA_FIFOMode_D
DMA_InitStructure.DMA_FIFOThreshold= DMA_FIFOThreshold_HalfF
DMA_InitStructure.DMA_MemoryBurst= DMA_MemoryBurst_S
DMA_InitStructure.DMA_PeripheralBurst= DMA_PeripheralBurst_S
DMA_Init(DMA2_Stream0, &DMA_InitStructure);
/* Enable DMA1 channel1 */
DMA_Cmd(DMA2_Stream0, ENABLE);
/* ADC1 configuration ------------------------------------------------------*/ ADC_CommonInitStructure.ADC_Mode = ADC_Mode_I/* ADCCLK = PCLK2/2 */
ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div8;/* Available only for multi ADC mode */
ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_D/* Delay between 2 sampling phases */
ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_20C
ADC_CommonInit(&ADC_CommonInitStructure);
//ADC_InitStructure.ADC_Mode = ADC_Mode_I ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
ADC_InitStructure.ADC_ScanConvMode = ENABLE;
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConvEdge_N
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_R
ADC_InitStructure.ADC_NbrOfConversion = M;
ADC_Init(ADC1, &ADC_InitStructure); //ADC_ContinuousModeCmd(ADC2,ENABLE);
/* ADC1 regular channel configuration */
ADC_RegularChannelConfig(ADC1, ADC_Channel_4, 1, ADC_SampleTime_15Cycles); ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 2, ADC_SampleTime_15Cycles); ADC_RegularChannelConfig(ADC1, ADC_Channel_6, 3, ADC_SampleTime_15Cycles); ADC_RegularChannelConfig(ADC1, ADC_Channel_7, 4, ADC_SampleTime_15Cycles); ADC_RegularChannelConfig(ADC1, ADC_Channel_12, 5, ADC_SampleTime_15Cycles); ADC_RegularChannelConfig(ADC1, ADC_Channel_13, 6, ADC_SampleTime_15Cycles); ADC_RegularChannelConfig(ADC1, ADC_Channel_14, 7, ADC_SampleTime_15Cycles); ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 8, ADC_SampleTime_15Cycles); ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 9, ADC_SampleTime_15Cycles); ADC_RegularChannelConfig(ADC1, ADC_Channel_15, 10, ADC_SampleTime_15Cycles);
ADC_DMARequestAfterLastTransferCmd(ADC1, ENABLE);
/* Enable ADC1 DMA */
ADC_DMACmd(ADC1, ENABLE);
/* Enable ADC1 */
ADC_Cmd(ADC1, ENABLE);/* Start ADC1 Software Conversion */
ADC_SoftwareStartConv(ADC1);}
阅读(1297)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
在LOFTER的更多文章
loftPermalink:'',
id:'fks_',
blogTitle:'stm32f207 ADC+DMA多通道采集,ADC数据大于4096 这篇日志完全错误,请勿参考',
blogAbstract:'& & & & & 之前做好了STM32F103上的外设,往stm32f207上移植的时候出了很多问题,比如ADC,按照库改动,改变了ADC初始化的相关参数后,还是无法采集到数据,最终多方面尝试,调试出来了,这里总结下stm32f207ADC几个要注意的地方。& & & & &1.DMA的选择,一开始使用DMA1_Channel0,采集不到数据,后来尝试DMA2_Channel0,可以采集到数据了。& & & & &2.ADC_DR_ADDRESS,根据使用的ADC在参考手册中查找ADC_DR的地址值,例如ADC1_DR对应地址& & & & & & 0x4001204c,ADC2_DR对应地址0x4001214c。',
blogTag:'stm32f207adc,adc数据大于4096,adc数据超过4096',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:6,
publishTime:6,
permalink:'blog/static/',
commentCount:0,
mainCommentCount:0,
recommendCount:0,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'有那么一天',
hmcon:'1',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}

我要回帖

更多关于 通道抠图 的文章

 

随机推荐