共2条
1/1 1 跳转至页
msp430f149,ADC12 请教刘工及各位大虾msp430f149 ADC12做波形采样,现已陷入僵局
问
我用MSP430f149 ADC12做波形采样,现已陷入僵局
#####==>的地方是我的问题
是电压变化信号范围在0~2。5V,采样频率应大于10K,XT2的晶振为8M
我的系统时种设置如下(######==>1.时钟设置正确否?######==>2.MCLK是不是最大了?):
DCOCTL=0Xe0; //F149基础时钟设置
BCSCTL1=0x07; //开启XT2振荡器
BCSCTL2=SELM_2; //定义MCLK为XT2;MCLK分频为1;SMCLK时钟源为DCOCLK,SMCLK分频为1
(######==>3.f149芯片的ADC12最大采样频率可达200K?)我的ADC采样编码设想如下:
设置ADC12采样频率尽可能高,ADC12中断服务子程序尽可能小,(######==>4.中断服务子程序时间应当不超过ADC12的采样周期,否则ADC12的采样周期会被拉长?)利用缓冲处理的形式,设置一个缓冲数组ADCbuf[2][122];在中断服务程序中对ADCbuf[0],ADCbuf[1]进行轮流缓冲,每当一个缓冲生成后,置一个缓冲完成标志bufok=1,主程序中根据bufok=1轮流对缓冲数组ADCbuf[0],ADCbuf[1]进行处理(是要对缓冲中的每个采样值进行处理),每处理完一个缓冲清bufok=0;(######==>5.对每一个缓冲的处理时间应小于每一个缓冲的生成时间,要么对缓冲的处理会一直被中断?)
我程序这样的:
void ADC12Init(void)
{
ADC12CTL0&=~ENC; //关闭adc12转换允许位
ADC12CTL0 =MSC+ADC12ON+SHT0_3; //开adc12内核,采样自动转换
ADC12CTL1=SHS_0+SHP+ADC12DIV_0+ADC12SSEL_2+CONSEQ_2; //单通道重复
ADC12MCTL0 = EOS+INCH_11;
ADC12IE = 0x0001; // Enable ADC12IFG.0
}
#pragma vector=ADC_VECTOR
__interrupt void ADCINT (void)// ADC中断服务程序
{
...
if (buf_y==0) //如果是新的缓冲开始,则一维下标应变化
{
ADcount+=1; //记录ADC缓冲发生次数,全局变量
buf_x^=0x01;
}
ADCbuf[buf_x][buf_y]=ADC12MEM0;
buf_y+=1;
...
}
void main(void)
{
...
F149Init();
ADC12Init();
_EINT(); //开总中断
...
ADC12CTL0 |= ENC; // 使能ADC12转换允许位
ADC12CTL0 |= ADC12SC; // 开始转换
while(1)
{
if (bufok==1)
ADCBM(); //对生成的缓冲进行处理,处理完后清bufok=0
else
_NOP();
}
}
void ADCBM(void)
{
...
for (i=0;i<122;i++)
{...}
...
ADBMcount+=1; //处理缓冲的次数,全局变量
bufok=0;
}
遇到的问题是这样的:
#######==>6.ADC的频率设置最高只能设为
ADC12CTL1=SHS_0+SHP+ADC12DIV_0+ADC12SSEL_2+CONSEQ_2; //单通道重复
ADC12MCTL0 = EOS+INCH_11; //(此时INCH_10,INCH_9....均有错误)
或
ADC12CTL1=SHS_0+SHP+ADC12DIV_4+ADC12SSEL_2+CONSEQ_2; //单通道重复
ADC12MCTL0 = EOS+INCH_6; //(此时INCH_5,INCH_4....均有错误)
或
ADC12CTL1=SHS_0+SHP+ADC12DIV_5+ADC12SSEL_2+CONSEQ_2; //单通道重复
ADC12MCTL0 = EOS+INCH_5; //(此时INCH_4,INCH_4....均有错误)
正常时, ADBMcount<=ADcount 且ADcount<=ADBMcount+1
有错误时的表现为:ADcount大大的大于ADBMcount+1,可能是ADC缓冲中断按照原有速度继续生成,但处理缓冲程序ADBM()的速度一直跟不上,一直被重复中断重新开始执行ADBM(),要如何解决??而且很奇怪,ADBM()的语句很短时,就上述几条指令时也一样??
######==>7.频率时间应怎么算?比如我设成
ADC12CTL1=SHS_0+SHP+ADC12DIV_5+ADC12SSEL_2+CONSEQ_2; //单通道重复
ADC12MCTL0 = EOS+INCH_5;
实际调试过程中,在c-spy里暂停时,采样频率(ADcount*12)大概才6K左右
而ADC频率计算时可得MCLK/(ADC12DIV*(4*INCH+13))即为8000000/(6*(4*24+13))约为12K,相差了一半左右
######==>8.如何估算我一个子程序的执行时间?
比如执行完以下指令要多长时间要怎么算?
for (i=0;i<122;i++) {ADBMcount+=1;ADBMcount*=2;}
======================================================================
以上是我程序中关于ADC的主要设置、说明及疑问,可能哆嗦了一些,但我想把问题说清楚,有关采样频率这个问题已经连续几个星期困绕着我了,周围又没地方问,大虾们指点指点,小弟不胜感激!!!
Email:lhjbox2000yahoo.com.cn 欢迎交流 答 1: 大虾们出出手吧... 答 2: 字比较多一下消化不了,再研究一下。 答 3: 现在真的是卡在这儿了,采样率提高不了,我的波形编码时对时错,郁闷哪。。
还是谢谢刘工顶了一下 答 4: ad 的采样频率 理论就是ad对信号的牌照时间 你要是把处理信号的时间也加进来那采样时间就。。。。。。如果要提高采样率 应该采集完再处理信号 答 5: 给LZ提供几个数据:
1、ADC12信号采样处理周期=ADC12采样时间tsample+ADC12转换时间tconvert+处理程序执行时间
2、关于tsample,请看下面的附件
3、tconvert=13*ADC12CLK
4、ADC12信号采样(1/tsample)可大于200kHz
5、ADC12内核带16个缓冲存储器
http://www.lierda.com/bbs/attachmen...ntid=2748&stc=1 答 6: mmtcyq文件如下
答 7: 刘新锋请问现在哪里? 答 8: input MUX-ON resistance max=2k,是啥东西,最高输入阻抗? 答 9: “input MUX-ON resistance max=2k”是说该模拟多路器的接通电阻最大值为2k欧姆。
有的多通道ADC前面有个模拟多路器,是模拟开关的一种,用以提供一对多的模拟信号切换。模拟开关的一个重要参数是“接通电阻”。
#####==>的地方是我的问题
是电压变化信号范围在0~2。5V,采样频率应大于10K,XT2的晶振为8M
我的系统时种设置如下(######==>1.时钟设置正确否?######==>2.MCLK是不是最大了?):
DCOCTL=0Xe0; //F149基础时钟设置
BCSCTL1=0x07; //开启XT2振荡器
BCSCTL2=SELM_2; //定义MCLK为XT2;MCLK分频为1;SMCLK时钟源为DCOCLK,SMCLK分频为1
(######==>3.f149芯片的ADC12最大采样频率可达200K?)我的ADC采样编码设想如下:
设置ADC12采样频率尽可能高,ADC12中断服务子程序尽可能小,(######==>4.中断服务子程序时间应当不超过ADC12的采样周期,否则ADC12的采样周期会被拉长?)利用缓冲处理的形式,设置一个缓冲数组ADCbuf[2][122];在中断服务程序中对ADCbuf[0],ADCbuf[1]进行轮流缓冲,每当一个缓冲生成后,置一个缓冲完成标志bufok=1,主程序中根据bufok=1轮流对缓冲数组ADCbuf[0],ADCbuf[1]进行处理(是要对缓冲中的每个采样值进行处理),每处理完一个缓冲清bufok=0;(######==>5.对每一个缓冲的处理时间应小于每一个缓冲的生成时间,要么对缓冲的处理会一直被中断?)
我程序这样的:
void ADC12Init(void)
{
ADC12CTL0&=~ENC; //关闭adc12转换允许位
ADC12CTL0 =MSC+ADC12ON+SHT0_3; //开adc12内核,采样自动转换
ADC12CTL1=SHS_0+SHP+ADC12DIV_0+ADC12SSEL_2+CONSEQ_2; //单通道重复
ADC12MCTL0 = EOS+INCH_11;
ADC12IE = 0x0001; // Enable ADC12IFG.0
}
#pragma vector=ADC_VECTOR
__interrupt void ADCINT (void)// ADC中断服务程序
{
...
if (buf_y==0) //如果是新的缓冲开始,则一维下标应变化
{
ADcount+=1; //记录ADC缓冲发生次数,全局变量
buf_x^=0x01;
}
ADCbuf[buf_x][buf_y]=ADC12MEM0;
buf_y+=1;
...
}
void main(void)
{
...
F149Init();
ADC12Init();
_EINT(); //开总中断
...
ADC12CTL0 |= ENC; // 使能ADC12转换允许位
ADC12CTL0 |= ADC12SC; // 开始转换
while(1)
{
if (bufok==1)
ADCBM(); //对生成的缓冲进行处理,处理完后清bufok=0
else
_NOP();
}
}
void ADCBM(void)
{
...
for (i=0;i<122;i++)
{...}
...
ADBMcount+=1; //处理缓冲的次数,全局变量
bufok=0;
}
遇到的问题是这样的:
#######==>6.ADC的频率设置最高只能设为
ADC12CTL1=SHS_0+SHP+ADC12DIV_0+ADC12SSEL_2+CONSEQ_2; //单通道重复
ADC12MCTL0 = EOS+INCH_11; //(此时INCH_10,INCH_9....均有错误)
或
ADC12CTL1=SHS_0+SHP+ADC12DIV_4+ADC12SSEL_2+CONSEQ_2; //单通道重复
ADC12MCTL0 = EOS+INCH_6; //(此时INCH_5,INCH_4....均有错误)
或
ADC12CTL1=SHS_0+SHP+ADC12DIV_5+ADC12SSEL_2+CONSEQ_2; //单通道重复
ADC12MCTL0 = EOS+INCH_5; //(此时INCH_4,INCH_4....均有错误)
正常时, ADBMcount<=ADcount 且ADcount<=ADBMcount+1
有错误时的表现为:ADcount大大的大于ADBMcount+1,可能是ADC缓冲中断按照原有速度继续生成,但处理缓冲程序ADBM()的速度一直跟不上,一直被重复中断重新开始执行ADBM(),要如何解决??而且很奇怪,ADBM()的语句很短时,就上述几条指令时也一样??
######==>7.频率时间应怎么算?比如我设成
ADC12CTL1=SHS_0+SHP+ADC12DIV_5+ADC12SSEL_2+CONSEQ_2; //单通道重复
ADC12MCTL0 = EOS+INCH_5;
实际调试过程中,在c-spy里暂停时,采样频率(ADcount*12)大概才6K左右
而ADC频率计算时可得MCLK/(ADC12DIV*(4*INCH+13))即为8000000/(6*(4*24+13))约为12K,相差了一半左右
######==>8.如何估算我一个子程序的执行时间?
比如执行完以下指令要多长时间要怎么算?
for (i=0;i<122;i++) {ADBMcount+=1;ADBMcount*=2;}
======================================================================
以上是我程序中关于ADC的主要设置、说明及疑问,可能哆嗦了一些,但我想把问题说清楚,有关采样频率这个问题已经连续几个星期困绕着我了,周围又没地方问,大虾们指点指点,小弟不胜感激!!!
Email:lhjbox2000yahoo.com.cn 欢迎交流 答 1: 大虾们出出手吧... 答 2: 字比较多一下消化不了,再研究一下。 答 3: 现在真的是卡在这儿了,采样率提高不了,我的波形编码时对时错,郁闷哪。。
还是谢谢刘工顶了一下 答 4: ad 的采样频率 理论就是ad对信号的牌照时间 你要是把处理信号的时间也加进来那采样时间就。。。。。。如果要提高采样率 应该采集完再处理信号 答 5: 给LZ提供几个数据:
1、ADC12信号采样处理周期=ADC12采样时间tsample+ADC12转换时间tconvert+处理程序执行时间
2、关于tsample,请看下面的附件
3、tconvert=13*ADC12CLK
4、ADC12信号采样(1/tsample)可大于200kHz
5、ADC12内核带16个缓冲存储器
http://www.lierda.com/bbs/attachmen...ntid=2748&stc=1 答 6: mmtcyq文件如下
答 7: 刘新锋请问现在哪里? 答 8: input MUX-ON resistance max=2k,是啥东西,最高输入阻抗? 答 9: “input MUX-ON resistance max=2k”是说该模拟多路器的接通电阻最大值为2k欧姆。
有的多通道ADC前面有个模拟多路器,是模拟开关的一种,用以提供一对多的模拟信号切换。模拟开关的一个重要参数是“接通电阻”。
共2条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
【笔记】生成报错synthdesignERROR被打赏50分 | |
【STM32H7S78-DK评测】LTDC+DMA2D驱动RGBLCD屏幕被打赏50分 | |
【STM32H7S78-DK评测】Coremark基准测试被打赏50分 | |
【STM32H7S78-DK评测】浮点数计算性能测试被打赏50分 | |
【STM32H7S78-DK评测】Execute in place(XIP)模式学习笔记被打赏50分 | |
每周了解几个硬件知识+buckboost电路(五)被打赏10分 | |
【换取逻辑分析仪】RA8 PMU 模块功能寄存器功能说明被打赏20分 | |
野火启明6M5适配SPI被打赏20分 | |
NUCLEO-U083RC学习历程2-串口输出测试被打赏20分 | |
【笔记】STM32CUBEIDE的Noruletomaketarget编译问题被打赏50分 |