STM32F4 的ADC是如何计算购买转换率计算时间时间的

后使用快捷导航没有帐号?
请完成以下验证码
查看: 591|回复: 6
stm32f103ADC采样时间计算问题
在线时间45 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 10, 距离下一级还需 190 积分
一粒金砂(中级), 积分 10, 距离下一级还需 190 积分
用软件触发采样一个通道的时间=(采样时间+12.5)*T,如果是顺序采样三个通道,则第一个、第二个和第三个通道的采样时间分别该怎么计算呢
补充内容 ( 14:25):
也就是比如连续采样转换三个通道的时候,得到的每个转换值的更新时间是多少
在线时间1546 小时
威望6522分
芯币24177枚
E金币400枚
TA的帖子TA的资源
就是三个时间的和呀
软触发一般用在固定的周期性采样的情况。
<p id="rate_918" onmouseover="showTip(this)" tip="很给力!&芯币 + 4 枚
威望 + 5 分
" class="mtn mbn">
在线时间45 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 10, 距离下一级还需 190 积分
一粒金砂(中级), 积分 10, 距离下一级还需 190 积分
就是三个时间的和呀
软触发一般用在固定的周期性采样的情况。
也就是多通道采样的时候,比如三个通道,每个通道的采样时间都为三个时间的和吗
不是啊,每个通道转换时间都是你上面那个式子&
&&&&&&&&&&
在线时间1546 小时
威望6522分
芯币24177枚
E金币400枚
TA的帖子TA的资源
也就是多通道采样的时候,比如三个通道,每个通道的采样时间都为三个时间的和吗
不是啊,每个通道转换时间都是你上面那个式子
谢谢版主解答,AD采样多通道顺序转换,会影响其他通道的采样时间吗,也就是同一通道(比如通道1)在同一AD频率和采样时间的设置下,就通道1单独采样转换与通道1和通道2通道3多通道顺序转换相比,采样转换时间一样吗&
在线时间1546 小时
威望6522分
芯币24177枚
E金币400枚
TA的帖子TA的资源
ADC_RegularChannelConfig(ADC1, DMAADC_CHANNEL, 1, ADCSAMPLETIME);
就是这个库函数设置的
在线时间45 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 10, 距离下一级还需 190 积分
一粒金砂(中级), 积分 10, 距离下一级还需 190 积分
不是啊,每个通道转换时间都是你上面那个式子
谢谢版主解答,AD采样多通道顺序转换,会影响其他通道的采样时间吗,也就是同一通道(比如通道1)在同一AD频率和采样时间的设置下,就通道1单独采样转换与通道1和通道2通道3多通道顺序转换相比,采样转换时间一样吗
在线时间45 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 10, 距离下一级还需 190 积分
一粒金砂(中级), 积分 10, 距离下一级还需 190 积分
不是啊,每个通道转换时间都是你上面那个式子
谢谢版主解答,AD采样多通道顺序转换,会影响其他通道的采样时间吗,也就是同一通道(比如通道1)在同一AD频率和采样时间的设置下,就通道1单独采样转换与通道1和通道2通道3多通道顺序转换相比,采样转换时间一样吗
EEWORLD 官方微信
Powered by21ic官方微信-->
ST MCU Finder
安装免费手机应用,
寻找理想的ST MCU
怎么计算ADC的转换时间,采样时间
初级工程师, 积分 2208, 距离下一级还需 792 积分
初级工程师, 积分 2208, 距离下一级还需 792 积分
初级工程师, 积分 2208, 距离下一级还需 792 积分
初级工程师, 积分 2208, 距离下一级还需 792 积分
有没有哪位大神帮忙回下,怎么计算ADC的转换时间,采样时间。1KHz的信号,高脉冲最多可以sample多少个点?
初级工程师, 积分 2154, 距离下一级还需 846 积分
初级工程师, 积分 2154, 距离下一级还需 846 积分
初级工程师, 积分 2154, 距离下一级还需 846 积分
初级工程师, 积分 2154, 距离下一级还需 846 积分
1、ADC的采样率。
2、高脉冲宽度。
这两个参数的话就基本可以计算高脉冲时能采到样点数
初级工程师, 积分 2400, 距离下一级还需 600 积分
初级工程师, 积分 2400, 距离下一级还需 600 积分
初级工程师, 积分 2400, 距离下一级还需 600 积分
初级工程师, 积分 2400, 距离下一级还需 600 积分
ADC的采样和转换时间可以从数据手册中查到。
初级工程师, 积分 2052, 距离下一级还需 948 积分
初级工程师, 积分 2052, 距离下一级还需 948 积分
初级工程师, 积分 2052, 距离下一级还需 948 积分
初级工程师, 积分 2052, 距离下一级还需 948 积分
高脉冲可以才几个点的简单计算方法是:高脉冲宽度/采样周期。
初级工程师, 积分 2187, 距离下一级还需 813 积分
初级工程师, 积分 2187, 距离下一级还需 813 积分
初级工程师, 积分 2187, 距离下一级还需 813 积分
初级工程师, 积分 2187, 距离下一级还需 813 积分
像楼上这种计算方法可能存在1~2个点的误差。
初级工程师, 积分 2997, 距离下一级还需 3 积分
初级工程师, 积分 2997, 距离下一级还需 3 积分
初级工程师, 积分 2997, 距离下一级还需 3 积分
初级工程师, 积分 2997, 距离下一级还需 3 积分
如果认为转换时间是从采样到输出数字码的时间,那么实际的转换时间就是1/Sample Rate,这个值是ADC自己的特性了。
初级工程师, 积分 2163, 距离下一级还需 837 积分
初级工程师, 积分 2163, 距离下一级还需 837 积分
初级工程师, 积分 2163, 距离下一级还需 837 积分
初级工程师, 积分 2163, 距离下一级还需 837 积分
对,如果指代的是采样之后的实际转换时间,那么就要查手册了。。
初级工程师, 积分 2463, 距离下一级还需 537 积分
初级工程师, 积分 2463, 距离下一级还需 537 积分
初级工程师, 积分 2463, 距离下一级还需 537 积分
初级工程师, 积分 2463, 距离下一级还需 537 积分
采样时间是需要从D/S当中查到的,这个数值是和IC设计时候的采样保持电路有关,在D/S当中都会有具体表述。
初级工程师, 积分 2677, 距离下一级还需 323 积分
初级工程师, 积分 2677, 距离下一级还需 323 积分
初级工程师, 积分 2677, 距离下一级还需 323 积分
初级工程师, 积分 2677, 距离下一级还需 323 积分
计算高脉冲能够才多少个点,通过计算单位时间内脉冲的个数和高脉冲所占的比例可以得到单位时间按高脉冲所占的时间的
初级工程师, 积分 2382, 距离下一级还需 618 积分
初级工程师, 积分 2382, 距离下一级还需 618 积分
初级工程师, 积分 2382, 距离下一级还需 618 积分
初级工程师, 积分 2382, 距离下一级还需 618 积分
如果看成流水处理的话,两个样点的时间间隔就是采样的时间间隔,存储和转换的时间可以不必过多考虑
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖您当前的位置:&>&&>&&>&
STM32 ADC采样时间、采样周期、采样频率计算方法
&ADC转换就是输入模拟的信号量,单片机转换成数字量。读取数字量必须等转换完成后,完成一个通道的读取叫做采样周期。采样周期一般来说=转换时间+读取时间
。而转换时间=采样时间+12.5个时钟周期。采样时间是你通过寄存器告诉采样模拟量的时间,设置越长越精确
ADC采样频率的确定
1. :先看一些资料,确定一下ADC的时钟:
(1),由时钟控制器提供的ADCCLK时钟和PCLK2(APB2时钟)同步。CLK控制器为ADC时钟提供一个专用的可编程预分频器。
(2) 一般情况下在程序 中将 PCLK2 时钟设为 与系统时钟 相同
/* HCLK = SYSCLK */
RCC_HCLKConfig(RCC_SYSCLK_Div1);
/* PCLK2 = HCLK */
RCC_PCLK2Config(RCC_HCLK_Div1);
/* PCLK1 = HCLK/2 */
RCC_PCLK1Config(RCC_HCLK_Div2);
(3)在时钟配置寄存器(RCC_CFGR) 中 有 为ADC时钟提供一个专用的可编程预分器
位15:14 ADCPRE:ADC预分频
由软件设置来确定ADC时钟频率
00:PCLK2 2分频后作为ADC时钟
01:PCLK2 4分频后作为ADC时钟
10:PCLK2 6分频后作为ADC时钟
11:PCLK2 8分频后作为ADC时钟
我们可对其进行设置 例如:
/* ADCCLK = PCLK2/4 */
RCC_ADCCLKConfig(RCC_PCLK2_Div4);
另外 还有 ADC 时钟使能设置
/* Enable ADC1, ADC2 and GPIOC clock */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_ADC2 |
RCC_APB2Periph_GPIOC, ENABLE);
(4)16.7 可编程的通道采样时间
ADC 使用若干个ADC_CLK
周期对输入电压采样,采样周期数目可以通过ADC_SMPR1和ADC_SMPR2寄存器中的SMP[2:0]位而更改。每个通道可以以不同的时间采样。
总转换时间如下计算:
TCONV(转换时间) = 采样时间+ 12.5 个周期
当ADCCLK=14MHz 和 1.5周期的采样时间:
TCONV = 1.5 + 12.5 = 14周期= 1&s
SMPx[2:0]:选择通道x的采样时间
这些位用于独立地选择每个通道的采样时间。在采样周期中通道选择位必须保持不变。
000:1.5周期100:41.5周期
001:7.5周期101:55.5周期
010:13.5周期110:71.5周期
011:28.5周期111:239.5周期
& ADC1的模拟输入通道16和通道17在芯片内部分别连到了温度传感器和VREFINT。
& ADC2的模拟输入通道16和通道17在芯片内部连到了VSS。
2. 具体分析如下:
(1)我们的输入信号是50Hz (周期为20ms),初步定为1周期200个采样点,(注:一周期最少采20个点,即采样率最少为1k) ,每2个 采样点间隔为
20ms /200 = 100 us
ADC可编程的通道采样时间 我们选最小的 1.5 周期,则 ADC采样周期一周期大小为
100us /1.5=66us 。 ADC 时钟频率为 1/66us =15 KHz。
ADC可编程的通道采样时间 我们选71.5 周期,则 ADC采样周期一周期大小为
(100us /71.5) 。 ADC 时钟频率为 7.15MHz。
(2)接下来我们要确定系统时钟:我们 用的是 8M Hz 的外部晶振做时钟源(HSE),估计得 经过 PLL倍频 PLL
倍频系数分别为2的整数倍,最大72 MHz。为了 提高数据 计算效率,我们把系统时钟定为72MHz,(PLL
9倍频)。则PCLK2=72MHz,PCLK1=36MHz;
我们通过设置时钟配置寄存器(RCC_CFGR) 中 有 为ADC时钟提供一个专用的可编程预分器,将PCLK2 8 分频后作为ADC 的时钟,则可知ADC
时钟频率为 9MHz
从手册可知: ADC 转换时间:
STM32F103xx增强型产品:ADC时钟为56MHz时为1&s(ADC时钟为72MHz为1.17&s)
(3)由以上分析可知:不太对应,我们重新对以上中 内容调整,提出如下两套方案:
方案一:我们的输入信号是50Hz
(周期为20ms),初步定为1周期2500个采样点,(注:一周期最少采20个点,即采样率最少为1k) ,每2个 采样点间隔为 20ms /2500 = 8
ADC可编程的通道采样时间 我们选71.5周期,则 ADC采样周期一周期大小为
8us /71.5 。 ADC时钟频率约为 9 MHz。
将PCLK2 8 分频后作为ADC 的时钟,则可知ADC 时钟频率为 9MHz
方案二:我们的输入信号是50Hz
(周期为20ms),初步定为1周期1000个采样点,(注:一周期最少采20个点,即采样率最少为1k) ,每2个 采样点间隔为 20ms /1000= 20
ADC可编程的通道采样时间 我们选239.5周期,则 ADC采样周期一周期大小为
20us /239.5 。 ADC时钟频率约为 12 MHz。
将PCLK2 6 分频后作为ADC 的时钟,则可知ADC 时钟频率为 12MHz查看: 29039|回复: 47
stm32f4 ADC采样频率是多少?
主题帖子精华
初级会员, 积分 130, 距离下一级还需 70 积分
在线时间3 小时
对于F4ADC配置有几点疑问希望大家帮忙解答一下:
edba92bcdab7c_812.png (0 Bytes, 下载次数: 1)
22:54 上传
问题1:这个表的意思是否是说明F4在供电电压大于2.4V时其最大时钟是36MHZ?当其时钟在30MHZ时,外部触发采样频率最大为1764KHZ?
&如果上面这个问题是对的话,那么对于库函数的几项操作有点疑问:
ccda8f2eb790fef292ed61_600.png (0 Bytes, 下载次数: 1)
22:54 上传
这个说明给出了ADC转换时间的计算方式,那么对应的我配置如下:
//ADC时钟为APB2的4分频-&84/4=21MHZ(F407ADC在2.4-3.6V供电电压下最大速率36M,稳定速度为30M)
& && &&&ADC_CommonInitStructure.ADC_Prescaler=ADC_Prescaler_Div4;
//配置ADC1规则组(得出其单次采样时间为-&(3+12)/21≈0.7us)
ADC_RegularChannelConfig(ADC1,ADC_Channel_10,1,ADC_SampleTime_3Cycles);
//两次采样的间隔时间为5个ADC时钟周期(5/21≈0.24us)
& && &&&ADC_CommonInitStructure.ADC_TwoSamplingDelay=ADC_TwoSamplingDelay_5C
问题2:按照如上数据理论值计算其最大采样频率:0.7+0.24≈1us-&1MHZ,是否是这样计算的?
问题3:我想用ADC+DMA+TIM触发的方式来做一个简易的示波器,方法就是通过TIM的定时触发ADC采样,将采样值装入DMA缓存中,DMA装满后触发LCD刷新程序。
有一个概念我不是很清楚,比如我一屏采100个点,要能显示400HZ的正弦信号,是不是说我ADC采样速率至少要100*400=40KHZ的速率呢?
补充内容 ( 17:49):
更正一个几年前的错误,
ADC_CommonInitStructure.ADC_TwoSamplingDelay=ADC_TwoSamplingDelay_5C
此项配置仅仅用于双重或三重交错模式下才有效,也就是说之前的计算是错误的
主题帖子精华
金钱129075
在线时间1154 小时
没玩过f4还,呵呵。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺:
主题帖子精华
初级会员, 积分 130, 距离下一级还需 70 积分
在线时间3 小时
回复【2楼】正点原子:
---------------------------------
现在实现了示波器功能,只能说感觉ADC采样速率很快,而且带有自动校准,比较强大。现在还未验证其采样频率的准确性
主题帖子精华
初级会员, 积分 130, 距离下一级还需 70 积分
在线时间3 小时
acbf8ea94bd1b26fb.png (0 Bytes, 下载次数: 1)
22:54 上传
再仔细看手册,发现其转换时间和转换位数也有关系。最开始我那个计算是按12位计算的,位数越少,转换越快
主题帖子精华
初级会员, 积分 130, 距离下一级还需 70 积分
在线时间3 小时
现在通过定时器触发AD采样,放入DMA缓存中。采样间隔是0.5us,12位采样精度,也就是2M的频率了,效果还是挺稳定的。已经能够满足我的要求了,结贴了。
主题帖子精华
金牌会员, 积分 1353, 距离下一级还需 1647 积分
在线时间67 小时
回复【5楼】KC_CEC:
---------------------------------
我也在用STM32F4&DISCOVERY&的ADC1,对比F1,发现寄存器还是有一些差别,尤其在对照原子的例程时,发现有些寄存器找不到,比如
1,AD复位和校准这一句,怎么也找不到相应的寄存器的相应位,尤其是无法校准的话,岂不是精度很差?
2,配置中断为软件触发中断,这个也没找到配置方法。
请教高人解答!
主题帖子精华
初级会员, 积分 130, 距离下一级还需 70 积分
在线时间3 小时
回复【6楼】jj123paopao:
---------------------------------
1、在f1中校准过程如下:
启动校准-&检测校准是否结束
整个过程中,除了软件使能校准外,外部不需要人为的操作。就是说整个过程是自动的,
既然是自动的,又需要人来软件使能不是多此一举了吗?所以f4取消了这个功能,应该
是在使能ADC的时候就内部自动校准了。(我看了手册,并没有说这部分,仅仅是我的猜测呵呵)
2、配置中断的时候并没有软件触发这个选项,配置中断是配置ADC进入中断的条件。
你要控制ADC是否开始,就直接设置是否进行转换就行了
主题帖子精华
金牌会员, 积分 1353, 距离下一级还需 1647 积分
在线时间67 小时
回复【7楼】KC_CEC:---------------------------------谢谢,我发现程序会死在这句:while(ADC1-&SR&&&1&&1);这句话作用是等待转换结束,注释掉之后就正常在串口中打印电压值了,用PA1采样板子上的3.3V电压,采样得到的最低电压是3.295166V,最高电压是3.299194V.请问为什么程序会卡死在那句话?
主题帖子精华
初级会员, 积分 130, 距离下一级还需 70 积分
在线时间3 小时
回复【8楼】jj123paopao:
---------------------------------
while(ADC1-&SR&&&(1&&1));
当ADC1-&SR&&&(1&&1)为真时,就会卡在while循环。
当ADC转换完成时,EOC为就会被置一,所以就会一直卡在这里,你逻辑搞反了。
应该是:while(!((ADC1-&SR)&&&(1&&1)));
给几点建议:
1.除非你很熟悉运算符优先级,不然最好运算之间用括号分明清楚。
2.为避免硬件错误导致整个系统瘫痪所以得加上硬件超时:
uint32_t u32_out=1000000;
while((!((ADC1-&SR)&&&(1&&1)))&&(u32_out--));
3.在资源够用的情况下,ADC最好和DMA联合使用给CPU最大空间干其它事情。
主题帖子精华
新手入门, 积分 161, 距离下一级还需 -141 积分
在线时间5 小时
楼主你好!(ADC+DMA)&我使用的是单个ADC多通道采集。&在配置的时候,使用了DMA&发送过半中断
这是stm32f4xx_it.c
中断程序
void&DMA2_Stream0_IRQHandler(void)
{
//??????·???DMA·?????°?????
&& if(DMA_GetFlagStatus(DMA2_Stream0,DMA_FLAG_HTIF0)==SET)&
&&&{&&
&&& &int&i;
&printf(&ok&);
for(i=0;i&256;i++)
data=&(ADC_ConvertedValue&&&&8)&&&0
printf(&%f&&,Rx_Buffer*16*3.3*2/4096);
&
SPI_FLASH_PageWrite(data,&MyWriteAddr,&256);
MyWriteAddr+=256;
// printf(&ok&);
DMA_ClearFlag(DMA2_Stream0,DMA_FLAG_HTIF0);
}else&if(DMA_GetFlagStatus(DMA2_Stream0,DMA_FLAG_TCIF0)==SET)&
&&&&{&&
for(i=256;i&512;i++)
data=&(ADC_ConvertedValue&&&&8)&&&0
SPI_FLASH_PageWrite(data,&MyWriteAddr,&256);
MyWriteAddr+=256;
// printf(&yes&);
DMA_ClearFlag(DMA2_Stream0,DMA_FLAG_TCIF0); &
if(MyWriteAddr&=0x3fffff)
DMA_ITConfig(DMA2_Stream0,DMA_IT_TC&|&DMA_IT_HT,DISABLE);
GPIO_ResetBits(GPIOB,GPIO_Pin_5);
printf(&\r\n&-------ADC×????á????????????????------\r\n&);
}
贴过来乱码出无关紧要!
这个是ADC配置&用了DMA中断!
#include&&adc.h&
#define&ADC1_DR_Address&&&&((uint32_t)0x4001224C)
__IO&uint16_t&ADC_ConvertedValue[CH_NUM]={0};
//__IO&u16&ADC_ConvertedValueL
/*
&*&????????ADC1_GPIO_Config
&*&?è??&&??????ADC1??DMA2???±??????????PC.01
&*&????:&??
&*&????&&????
&*&?÷??&&???????÷??
&*/
/*&????????ADC1_Mode_Config
&*&?è??&&??????ADC1???¤×÷??????DMA????
&*&????:&??
&*&????&&????
&*&?÷??&&???????÷??
&*/
&
&
&
&/*&????????ADC1_Config
&*&?è??&&??????ADC1???¤×÷??????DMA????
&*&????:&??
&*&????&&????
&*&?÷??&&???????÷??
&*/
&static&void&ADC1_Config(void)
{
GPIO_InitTypeDef&GPIO_InitS
DMA_InitTypeDef&DMA_InitS
ADC_InitTypeDef&ADC_InitS
ADC_CommonInitTypeDef&ADC_CommonInitS
/*&Enable&DMA&clock&*/
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2,&ENABLE);
/*&Enable&GPIOC&clock&*/
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC,&ENABLE);
/*&Enable&ADC1&clock&*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,&ENABLE);
/*&DMA&channel0&configuration&*/
DMA_DeInit(DMA2_Stream0);
DMA_InitStructure.DMA_Channel&=&DMA_Channel_0;&&
DMA_InitStructure.DMA_PeripheralBaseAddr&=&ADC1_DR_A &//ADC???·
DMA_InitStructure.DMA_Memory0BaseAddr&=&(u32)&ADC_ConvertedV//???????·
DMA_InitStructure.DMA_DIR&=&DMA_DIR_PeripheralToM
DMA_InitStructure.DMA_BufferSize&=&CH_NUM;
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_InitStructure.DMA_M2M&=&DMA_M2M_D
DMA_Init(DMA2_Stream0,&&DMA_InitStructure);
//DMA_ITConfig(DMA2_Stream0,DMA_IT_TC,ENABLE);
DMA_Cmd(DMA2_Stream0,&ENABLE);
/*&Configure&nbspC.01&&as&analog&input&*/
GPIO_InitStructure.GPIO_Pin&=&GPIO_Pin_0&|&GPIO_Pin_1&|&GPIO_Pin_2&|&GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode&=&GPIO_Mode_AN;
GPIO_InitStructure.GPIO_PuPd&=&GPIO_PuPd_NOPULL&;
GPIO_Init(GPIOC,&&GPIO_InitStructure);
//&nbspC0,PC1,PC2,?????±?????è??????
&&/*&ADC1&configuration&*/
ADC_CommonInitStructure.ADC_Mode&=&ADC_Mode_I
&&ADC_CommonInitStructure.ADC_Prescaler&=&ADC_Prescaler_Div2;//ADC?±??21MHz
&&ADC_CommonInitStructure.ADC_DMAAccessMode&=&ADC_DMAAccessMode_D
&&ADC_CommonInitStructure.ADC_TwoSamplingDelay&=&ADC_TwoSamplingDelay_5C
&&ADC_CommonInit(&ADC_CommonInitStructure);
ADC_InitStructure.ADC_Resolution&=&ADC_Resolution_12b;//????ADC????
ADC_InitStructure.ADC_ScanConvMode&=&ENABLE;& &//?????¨?è???????¨?è?????????à?¨??????
ADC_InitStructure.ADC_ContinuousConvMode&=&ENABLE; //????????×?????????????????????ADC×???
ADC_InitStructure.ADC_ExternalTrigConvEdge&=&ADC_ExternalTrigConvEdge_N//????????????·?×???
&&ADC_InitStructure.ADC_ExternalTrigConv&=&ADC_ExternalTrigConv_T1_CC1;
ADC_InitStructure.ADC_DataAlign&=&ADC_DataAlign_L& //????????×ó????
ADC_InitStructure.ADC_NbrOfConversion&=&4; & //??×??????¨??????4
ADC_Init(ADC1,&&ADC_InitStructure);
/*????ADC1???¨??10,11,12??3?????ù???????ò????1,2,3,4&*/&
ADC_RegularChannelConfig(ADC1,&ADC_Channel_10,&1,&ADC_SampleTime_3Cycles);
ADC_RegularChannelConfig(ADC1,&ADC_Channel_11,&2,&ADC_SampleTime_3Cycles);
ADC_RegularChannelConfig(ADC1,&ADC_Channel_12,&3,&ADC_SampleTime_3Cycles);
ADC_RegularChannelConfig(ADC1,&ADC_Channel_13,&4,&ADC_SampleTime_3Cycles);
//ADC_DMARequestAfterLastTransferCmd(ADC1,&ENABLE);
/*&Enable&ADC1&DMA&*/
ADC_DMACmd(ADC1,&ENABLE);
/*&Enable&ADC1&*/
ADC_Cmd(ADC1,&ENABLE);
/*??????×??????÷&*/&&&
/*ADC_ResetCalibration(ADC1);*/
/*??????×??????÷?????ê??&*/
/*while(ADC_GetResetCalibrationStatus(ADC1));*/
/*&ADC??×?&*/
/*ADC_StartCalibration(ADC1);*/
/*&??????×??ê??*/
/*while(ADC_GetCalibrationStatus(ADC1));*/
void&NVIC_Config(void)
{
NVIC_InitTypeDef&NVIC_InitS
/*&Configure&one&bit&for&preemption&priority&*/
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
/*&????P[A|B|C|D|E]0????????&*/
NVIC_InitStructure.NVIC_IRQChannel&=&DMA2_Stream0_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority&=&1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority&=&1;
NVIC_InitStructure.NVIC_IRQChannelCmd&=&ENABLE;
NVIC_Init(&NVIC_InitStructure);
/*
&*&????????ADC1_Init
&*&?è??&&????
&*&????&&????
&*&????&&????
&*&?÷??&&???????÷??
&*/
&void&ADC_start(void)
&{
&/*&??????????????????·????ù???????í????·?ADC×???&*/&
ADC_SoftwareStartConv(ADC1);
/*&Enable&ADC1&DMA&*/
ADC_DMACmd(ADC1,&ENABLE);
/*&Enable&ADC1&*/
ADC_Cmd(ADC1,&ENABLE);
/*&Enable&DMA&channel0&*/
DMA_Cmd(DMA2_Stream0,&ENABLE);
DMA_ITConfig(DMA2_Stream0,DMA_IT_TC&|&DMA_IT_HT,ENABLE);
&}
void&ADC1_Init(void)
{
ADC1_Config();
NVIC_Config();
}
求解为什么我的DMA中断进不去,还是我的ADC没有工作,本人做的是一个数据采集,其他led&exti&usart&均已调试成功!
跪求大神指点。
主题帖子精华
初级会员, 积分 130, 距离下一级还需 70 积分
在线时间3 小时
回复【10楼】天使的诺言:
---------------------------------
ADC_CommonInitStructure.ADC_DMAAccessMode&=&ADC_DMAAccessMode_D&
可能是你没有使能DMA转换吧。
库函数里面可以读取很多标志位的,通过串口打印各个标志位就知道自己哪一步搞错了哦。
主题帖子精华
新手入门, 积分 21, 距离下一级还需 -1 积分
在线时间0 小时
ADC_CommonInitStructure.ADC_TwoSamplingDelay=ADC_TwoSamplingDelay_5C
这里的采样延时只是在双重或者三重交叉下使用,不计算在采样频率中
主题帖子精华
初级会员, 积分 80, 距离下一级还需 120 积分
在线时间0 小时
你好,我也想做一个简易示波器,双ADC+DMA我已经调通不过用的是F1
我想问一下楼主是怎么把数据在LCD上还原成正弦曲线的。。。
我是伸手党
主题帖子精华
初级会员, 积分 130, 距离下一级还需 70 积分
在线时间3 小时
回复【13楼】球球~电子:
---------------------------------
1、根据你DMA缓存中的数据可以换算出电压
2、根据你LCD上所想表示的分辨率就可以算出一个像素代表的电压是多少了
主题帖子精华
中级会员, 积分 413, 距离下一级还需 87 积分
在线时间1 小时
请问楼主,/ADC时钟为APB2的4分频-&84/4=21MHZ(F407ADC在2.4-3.6V供电电压下最大速率36M,稳定速度为30M)
&&&&&&&&ADC_CommonInitStructure.ADC_Prescaler=ADC_Prescaler_Div4;
//配置ADC1规则组(得出其单次采样时间为-&(3+12)/21≈0.7us)
ADC_RegularChannelConfig(ADC1,ADC_Channel_10,1,ADC_SampleTime_3Cycles);
//两次采样的间隔时间为5个ADC时钟周期(5/21≈0.24us)
&&&&&&&&ADC_CommonInitStructure.ADC_TwoSamplingDelay=ADC_TwoSamplingDelay_5C
最大采样频率:0.7+0.24≈1us
和定时器设定的频率到底什么关系,如果ad用定时器设定了采样频率&,那上面的1us是什么
主题帖子精华
初级会员, 积分 130, 距离下一级还需 70 积分
在线时间3 小时
回复【15楼】liyunjiajia:
---------------------------------
设定了由定时器触发ADC的话,定时器频率就是ADC的采样间隔时间了。
当然采样频率就不会按照1us那样算了,但是单次的采样时间还是一样的
主题帖子精华
中级会员, 积分 413, 距离下一级还需 87 积分
在线时间1 小时
谢谢你,还有个问题,我用定时器中断进行ad转换,&ADC_InitStructure.ADC_ContinuousConvMode&=&ENABLE;&模数转换工作在连续转换模式
为什么工作在连续模式?应该是单次采样,中断触发啊?
主题帖子精华
初级会员, 积分 130, 距离下一级还需 70 积分
在线时间3 小时
回复【17楼】liyunjiajia:
---------------------------------
你这样做有点非主流,用中断触发ADC,效率会很低下。
并且不能精确控制ADC的采样率了。
应该是:
ADC_InitStructure.ADC_ExternalTrigConv&=&ADC_ExternalTrigConv_T2_TRGO;
通过定时器时基来触发ADC,与DMA联立。
这样ADC会根据你设置的定时器溢出频率自动循环采样,并且将采样的结果放入DMA缓存,
你只需要判断DMA缓存装满以后将缓存读出来即可。
主题帖子精华
中级会员, 积分 413, 距离下一级还需 87 积分
在线时间1 小时
太谢谢你了,你有没有定时器触发ad转换的整个程序啊?我是初学者,有点蒙
主题帖子精华
初级会员, 积分 130, 距离下一级还需 70 积分
在线时间3 小时
以stm32f4的ADC1为例,用TIM2做触发,模拟一个简单的示波器:
[C] 纯文本查看 复制代码#define
ADC1_DR_Address
((uint32_t)ADC1_BASE+0x4c)
__IO uint16_t ADC1OscConver[1000];
功能:配置adc1IO口
static void Adc1IoConfig(void)
GPIO_InitTypeDef GPIO_InitS
//开C口时钟,
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);
//复位配置
GPIO_StructInit(&GPIO_InitStructure);
//设置为模拟输入模式
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AN;
//不带上拉
GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;
//将以上设置应用于寄存器
GPIO_Init(GPIOC,&GPIO_InitStructure);
功能:tim2触发器初始化
static void Tim2Config(void)
TIM_TimeBaseInitTypeDef
TIM_TimeBaseInitS
//打开TIM时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
//初始化配置结构,不受其它配置干扰
TIM_TimeBaseStructInit(&TIM_TimeBaseInitStructure);
//对APB1时钟不分频,由system_stm32f4xx.c可知
//APB1=AHB/4=SYSCLK/4=168M/4=42M,则TIM3=APB1*2=84M
TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
//分频值=168M/(Prescaler+1)/2=0.5us
TIM_TimeBaseInitStructure.TIM_Prescaler=42-1;
//溢出时间确定
TIM_TimeBaseInitStructure.TIM_Period=44;
//向上计数方式
TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;
//将以上配置应用于定时器
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure);
//数据更新作为触发源
TIM_SelectOutputTrigger(TIM2,TIM_TRGOSource_Update);
功能:ADC1的示波器功能配置
备注:使用tim2做触发
void Adc1OscConfig(void)
DMA_InitTypeDef DMA_InitS
NVIC_InitTypeDef
NVIC_InitS
//开启MDA2时钟
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE);
//初始化各寄存器配置
DMA_DeInit(DMA2_Stream0);
DMA_StructInit( &DMA_InitStructure);
//选取DMA通道0,数据流0
DMA_InitStructure.DMA_Channel=DMA_Channel_0;
//数据传入地址-&ADC基地址加上DR寄存器偏移地址
DMA_InitStructure.DMA_PeripheralBaseAddr=(uint32_t)ADC1_DR_A
//数据送入地址
DMA_InitStructure.DMA_Memory0BaseAddr=(uint32_t)ADC1OscC
//数据传送方向为外设到SRAM
DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralToM
//数据缓冲区1
DMA_InitStructure.DMA_BufferSize=1000;
//外设地址固定
DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_D
//内存地址自增
DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_E
//数据类型为半字
DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_HalfW//DMA_PeripheralDataSize_B//DMA_PeripheralDataSize_HalfW
DMA_InitStructure.DMA_MemoryDataSize=DMA_MemoryDataSize_HalfW//DMA_MemoryDataSize_B//DMA_MemoryDataSize_HalfW
//循环传输
DMA_InitStructure.DMA_Mode=DMA_Mode_C
//高优先级
DMA_InitStructure.DMA_Priority=DMA_Priority_L
//不使用FIFO模式
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_DoubleBufferModeCmd(DMA2_Stream0, DISABLE);
//将以上设置应用于DMA2,通道0,数据流0
DMA_Init(DMA2_Stream0,&DMA_InitStructure);
DMA_Cmd(DMA2_Stream0, ENABLE);
//选择DMA2通道数据流0
NVIC_InitStructure.NVIC_IRQChannel=DMA2_Stream0_IRQn;//DMA2_Stream0_IRQH
//抢占式优先级为0
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;
//响应式优先级为12
NVIC_InitStructure.NVIC_IRQChannelSubPriority=4;
//通道使能
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
//将以上配置应用于NVIC
NVIC_Init(&NVIC_InitStructure);
//使能DMA传输完成中断
DMA_ITConfig(DMA2_Stream0,DMA_IT_TC,ENABLE);
功能:ADC配置
ADC_InitTypeDef ADC_InitS
//开启ADC1时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
//12位转换精度
ADC_InitStructure.ADC_Resolution=ADC_Resolution_12b;//ADC_Resolution_8b;//ADC_Resolution_12b;
//使用单通道转换模式
ADC_InitStructure.ADC_ScanConvMode=DISABLE;
//不使用多次转换模式
ADC_InitStructure.ADC_ContinuousConvMode=DISABLE;//ENABLE;//DISABLE;
//使用外部上升沿触发模式
ADC_InitStructure.ADC_ExternalTrigConvEdge=ADC_ExternalTrigConvEdge_R//ADC_ExternalTrigConvEdge_R//ADC_ExternalTrigConvEdge_N
//TIM3溢出触发
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T2_TRGO;//ADC_ExternalTrigConv_T1_CC1;
//选择右对齐方式
ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_R
//选用转换通道数为1个
ADC_InitStructure.ADC_NbrOfConversion=1;
//将以上设置应用于对应寄存器
ADC_Init(ADC1,&ADC_InitStructure);
//使能ADC在DMA模式下的连续转换
ADC_DMARequestAfterLastTransferCmd(ADC1,ENABLE);
//使能ADC的DMA模式
ADC_DMACmd(ADC1,ENABLE);
//配置ADC1规则组(得出其单次采样时间为:(3+12)/21≈0.7us)-&12bit
ADC_RegularChannelConfig(ADC1,ADC_Channel_10,1,ADC_SampleTime_3Cycles);//ADC_SampleTime_3Cycles/ADC_SampleTime_480Cycles
ADC_Cmd(ADC1,ENABLE);
功能:各ADC共同功能配置
static void AdcSenCommConfig(void)
ADC_CommonInitTypeDef ADC_CommonInitS
//ADC为独立模式
ADC_CommonInitStructure.ADC_Mode=ADC_Mode_I
//ADC时钟为APB2的2分频-&84/4=21MHZ(F407ADC在2.4-3.6V供电电压下最大速率36M,稳定速度为30M)
ADC_CommonInitStructure.ADC_Prescaler=ADC_Prescaler_Div8;
//使用ADC的DMA复用
ADC_CommonInitStructure.ADC_DMAAccessMode=ADC_DMAAccessMode_2;
//两次采样的间隔时间为5个ADC时钟周期(5/21≈0.24us)
ADC_CommonInitStructure.ADC_TwoSamplingDelay=ADC_TwoSamplingDelay_5C
//将以上设置应用于对应的寄存器
ADC_CommonInit(&ADC_CommonInitStructure);
功能:开始ADC1示波器采样
void StartAdc1OscSam(void)
TIM_Cmd(TIM2, ENABLE);
功能:停止ADC1示波器采样
void StopAdc1OscSam(void)
TIM_Cmd(TIM2, DISABLE);
如果要切换采样时间,可以:
[C] 纯文本查看 复制代码#define OSC_TIME(val)
TIM_SetCounter(TIM2,0);TIM_SetAutoreload(TIM2,val)
主题帖子精华
初级会员, 积分 130, 距离下一级还需 70 积分
在线时间3 小时
回复【19楼】liyunjiajia:
---------------------------------
上面的代码中,DMA是单缓冲模式。
可以配置为双缓冲模式,这样就可以不用停止DMA来实现无间歇循环采样。
主题帖子精华
中级会员, 积分 413, 距离下一级还需 87 积分
在线时间1 小时
太&谢谢你了
主题帖子精华
中级会员, 积分 413, 距离下一级还需 87 积分
在线时间1 小时
请问如何&为双缓冲模式,这样就可以不用停止DMA来实现无间歇循环采样。
为什么要开中断,来使能DMA传输完成?开中断有什么意义?
主题帖子精华
初级会员, 积分 130, 距离下一级还需 70 积分
在线时间3 小时
回复【23楼】liyunjiajia:
---------------------------------
1、所谓的双缓冲,指的是DMA有两个目的缓存,比如A和B。
A/B各有1000个uint16_t型大小,DMA会在A装满后,自动切换到B缓存。
循环的交替下去,这样就可以在A装满后处理A缓存,而不需要先停止DMA了。
(为了保护数据)
2、当DMA传输完成后,就会中断提醒CPU来进行缓存即使处理。
当然也可以不开中断,用循环扫描的方式。你得根据你的实际应用而定
主题帖子精华
中级会员, 积分 413, 距离下一级还需 87 积分
在线时间1 小时
你好,我做了一个ad,da转换的程序,给一个电压,串口调试助手里面显示不出来,您能不能帮我看下程序呢?
21:33 上传
点击文件名下载附件
9.22 MB, 下载次数: 480
主题帖子精华
中级会员, 积分 305, 距离下一级还需 195 积分
在线时间18 小时
回复【24楼】KC_CEC:
---------------------------------
楼主你好,我看了下您的帖子,非常厉害,我想请教一下,我想采集四个通道的ADC,采用速率要求是500KHz,采集的是四个通道的波形,要采集时间长一点,但是DMA所能传的的数据仅仅是65535个,传完了就会有要重新开始循环存储空间了,我现在想想你说的那个双缓存比较好,不知道怎么写程序你能帮我吗?
主题帖子精华
初级会员, 积分 57, 距离下一级还需 143 积分
在线时间5 小时
楼主你好,我最近也在用stm32做一个示波器。但是显示效果并不理想,有一些频率的正弦波可以显示,可是另一些却无法显示。我想问一下是不是跟采样间隔有关系,应该如何调整。
主题帖子精华
初级会员, 积分 190, 距离下一级还需 10 积分
在线时间0 小时
楼主,可不可以把你的示波器工程分享出来一下,我想深入参考学习,谢谢!
M4小白菜,求各位大牛多多指导
主题帖子精华
新手入门, 积分 36, 距离下一级还需 -16 积分
在线时间0 小时
回复【16楼】KC_CEC:
---------------------------------
问下你这里的ADC采样时间间隔指的是ADC_CommonInitStructure.ADC_TwoSamplingDelay=ADC_TwoSamplingDelay_5Cycles这个时间吗?
主题帖子精华
初级会员, 积分 130, 距离下一级还需 70 积分
在线时间3 小时
回复【29楼】静秋:
---------------------------------
这个值在多重ADC模式下才有意义,比如ADC1和ADC2交替采样模式的交替间隔
主题帖子精华
中级会员, 积分 237, 距离下一级还需 263 积分
在线时间40 小时
回复【13楼】球球~电子:
---------------------------------
借楼问个问题
我现在stm32f103双ADC连续采集8个通道,DMA中断,在定时器中使能,可以正常使用
但是我现在想改成循环采集5次,可是怎么修改程序都不能运行,有谁使用过双ADC连续循环采集功能没?可能会是哪里的问题呢?
余生请你指教!
主题帖子精华
高级会员, 积分 619, 距离下一级还需 381 积分
在线时间125 小时
本帖最后由 elvin 于
16:37 编辑
回复【29楼】静秋:
---------------------------------
这个值在多重ADC模式下才有意义,比如ADC1和ADC2交 ...
/** @defgroup ADC_delay_between_2_sampling_phases
#define ADC_TwoSamplingDelay_5Cycles& && && && && &((uint32_t)0x)
&&uint32_t ADC_TwoSamplingD& && && & /*!& Configures the Delay between 2 sampling phases.
& && && && && && && && && && && && && && && &&&This parameter can be a value of
& && && && && && && && && && && && && && && &&&@ref ADC_delay_between_2_sampling_phases */
定义在两个采样保持阶段中间的ADC的延迟
怎么理解成在多ADC模式下才有意义呢,这地方不太理解啊& && &原子哥求助@正点原子
主题帖子精华
高级会员, 积分 619, 距离下一级还需 381 积分
在线时间125 小时
/** @defgroup ADC_delay_between_2_sampling_phases
我搞明白了,这个延迟确实是在多重adc模式下的延迟。
1 他是在ADC通用配置里配置的
2从固件库提供的示例里,计算最高转换速率里能倒推出来。@正点原子
主题帖子精华
初级会员, 积分 94, 距离下一级还需 106 积分
在线时间27 小时
回复【2楼】正点原子:
---------------------------------
现在实现了示波器功能,只能说感觉ADC采样速率很 ...
请问楼主还在吗。。。我现在想采集AD的电压信号 用DMA传送 然后显示波形,能指点下不呢
主题帖子精华
新手入门, 积分 32, 距离下一级还需 -12 积分
在线时间6 小时
楼主求分享工程
主题帖子精华
初级会员, 积分 59, 距离下一级还需 141 积分
在线时间17 小时
现在通过定时器触发AD采样,放入DMA缓存中。采样间隔是0.5us,12位采样精度,也就是2M的频率了,效果还是挺 ...
你好,感觉你对这块了解得应该挺深的,有几个疑问想咨询一下你?
//ADC时钟为APB2的4分频-&84/4=21MHZ(F407ADC在2.4-3.6V供电电压下最大速率36M,稳定速度为30M)
& && &&&ADC_CommonInitStructure.ADC_Prescaler=ADC_Prescaler_Div4;
//配置ADC1规则组(得出其单次采样时间为-&(3+12)/21≈0.7us)
ADC_RegularChannelConfig(ADC1,ADC_Channel_10,1,ADC_SampleTime_3Cycles);
//两次采样的间隔时间为5个ADC时钟周期(5/21≈0.24us)
& && &&&ADC_CommonInitStructure.ADC_TwoSamplingDelay=ADC_TwoSamplingDelay_5C
你那问题1,装换一次需要的时间为7us,你定时器定的时间0.5us转换完了吗,不会出错?
12bit的ADC转换时间至少就需要15个周期,你能解释一下吗?
主题帖子精华
初级会员, 积分 59, 距离下一级还需 141 积分
在线时间17 小时
现在通过定时器触发AD采样,放入DMA缓存中。采样间隔是0.5us,12位采样精度,也就是2M的频率了,效果还是挺 ...
还有就是双重ADC或者三重ADC交替转换,这个采样率又该怎么算?
主题帖子精华
新手入门, 积分 14, 距离下一级还需 6 积分
在线时间1 小时
请教大神一个问题:如何在STM32F4中使用中断来写ADC函数,我写的程序不知道哪里有问题 求指教
#include &adc.h&
#include &delay.h&
#include &led.h&
u32 ADCvalue = 0;
void ADCInitial(void)
& & & & ADC_InitTypeDef& & & & & & & & & & & & & & & & & & & & ADC_InitS
& & & & GPIO_InitTypeDef& & & & & & & & & & & & & & & & GPIO_InitS
& & & & ADC_CommonInitTypeDef& & & & & & & & ADC_CommonInitS
& & & & NVIC_InitTypeDef& & & & & & & & & & & & & & & & NVIC_InitS
& & & & RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
& & & & RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);
& & & & GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
& & & & //GPIO_InitStructure.GPIO_OType =
& & & & GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
& & & & GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
& & & & GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
& & & & GPIO_Init(GPIOA,&GPIO_InitStructure);
& & & & ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
& & & & ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_R
&&ADC_InitStructure.ADC_ExternalTrigConv =
& & & & ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_N
& & & & ADC_InitStructure.ADC_NbrOfConversion = 1;
& & & & ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
& & & & ADC_InitStructure.ADC_ScanConvMode = DISABLE;& & & &
& & & & ADC_Init(ADC1,&ADC_InitStructure);
& & & & ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_D
& & & & ADC_CommonInitStructure.ADC_Mode = ADC_Mode_I
& & & & ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div4;
& & & & ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5C//3¢ê&#212;&#187;&#187;2&#187;í&#172;μ&#196;Cycle
& & & & ADC_CommonInit(&ADC_CommonInitStructure);
& & & & ADC_Cmd(ADC1,ENABLE);
& & & & ADC_ITConfig(ADC1,ADC_IT_EOC,ENABLE);
& & & & ADC_RegularChannelConfig(ADC1,ADC_Channel_5,1,ADC_SampleTime_480Cycles);//3¢ê&#212;&#187;&#187;2&#187;í&#172;μ&#196;Cycle
& & & & ADC_SoftwareStartConv(ADC1);
& & & & NVIC_InitStructure.NVIC_IRQChannel = ADC_IRQn;
& & & & NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
& & & & NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
& & & & NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
& & & & NVIC_Init(&NVIC_InitStructure);
void ADC_IRQHandler(void)
& & & & u32 tempValue = 0;
& & & & if(ADC_GetITStatus(ADC1,ADC_IT_EOC) == SET)
& & & & & & & & tempValue =&&ADC_GetConversionValue(ADC1);
& & & & & & & & delay_ms(5);
& & & & ADCvalue = tempV
& & & & delay_ms(200);
& & & & ADC_ClearITPendingBit(ADC1,ADC_IT_EOC);
主题帖子精华
高级会员, 积分 818, 距离下一级还需 182 积分
在线时间162 小时
楼主可不可以把你的代码贴出来,学习学习,我是个新手
主题帖子精华
初级会员, 积分 181, 距离下一级还需 19 积分
在线时间19 小时
楼主,你说的是2M的采样频率即0.5us采样一次,但是上面写的采样时间就需要0.7us,你是怎么处理这个问题的呢? 你做的示波器显示效果怎么样?200KHz的正弦波能够比较精确的还原出来么?
主题帖子精华
初级会员, 积分 130, 距离下一级还需 70 积分
在线时间3 小时
楼主,你说的是2M的采样频率即0.5us采样一次,但是上面写的采样时间就需要0.7us,你是怎么处理这个问题的呢?&&...
对不起,以前的工程记不起来了。
按照理论来说,这样应该会出问题的,数据都还不稳定。
我记得好像是我后来改成了2分频了,现在源码不见了,没法验证了。。。
主题帖子精华
初级会员, 积分 79, 距离下一级还需 121 积分
在线时间9 小时
现在通过定时器触发AD采样,放入DMA缓存中。采样间隔是0.5us,12位采样精度,也就是2M的频率了,效果还是挺 ...
楼主,您好。请问.F407的ADC在保证精度不太差的情况下,采样频率能到多大?我采200k正弦信号,设置好采样时间后(28个周期),发现结果误差很大,能帮帮回答一下吗?
主题帖子精华
初级会员, 积分 97, 距离下一级还需 103 积分
在线时间22 小时
楼主大牛,我目前在做,声波测温,想用ADC+DMA检测两个脉冲的时间间隔?楼主有什么建议吗?不会发图
主题帖子精华
初级会员, 积分 97, 距离下一级还需 103 积分
在线时间22 小时
该如何计算?我也遇到相同的程序了
主题帖子精华
初级会员, 积分 77, 距离下一级还需 123 积分
在线时间26 小时
回复【17楼】liyunjiajia:
---------------------------------
你这样做有点非主流,用中断触发ADC,效率会 ...
楼主& & 请问这个判断DMA缓存装满该怎么判断呢??&&我最近在做ADC+DMA+以太网的& & 发现上位机接收到的数据有断点,而且采样率和我设置的采样率相差有点大,不知道是不是DMA和网口速率问题。不过,我把DMA搬运的数据是直接通过网口传给上位机的,好像没有进行判断DMA缓存是否装满。。请问你知不知道这是啥问题?
(90.33 KB, 下载次数: 1)
10:48 上传
主题帖子精华
新手入门, 积分 26, 距离下一级还需 -6 积分
在线时间2 小时
源码可否借鉴一下哎?
主题帖子精华
高级会员, 积分 503, 距离下一级还需 497 积分
在线时间124 小时
Anna 发表于
楼主& & 请问这个判断DMA缓存装满该怎么判断呢??&&我最近在做ADC+DMA+以太网的& & 发现上位机接收到的 ...
DMA的功能,当然DMA一页,DMA半传输,传输都是能检测的,ADC当然没有说DMA是否装满这一功能
主题帖子精华
中级会员, 积分 397, 距离下一级还需 103 积分
在线时间15 小时
楼主& & 请问这个判断DMA缓存装满该怎么判断呢??&&我最近在做ADC+DMA+以太网的& & 发现上位机接收到的 ...
开 双缓存 去中断 读数据
我就是我,等待爆发那一刻......
Powered by}

我要回帖

更多关于 时间转换和计算 java 的文章

更多推荐

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

点击添加站长微信