3774|6

49

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

写了一个检测频率的代码,怎么不行啊帮忙看看! [复制链接]

通过检测波的两个峰值之间的时间,计算出频率,但是我接对于2500HZ和小于2500HZ的波都P1.0驱动的灯亮,最后查看寄存器看到TAR显示是1,计时器肯定不会溢出的频率算过之后,所以Period就是1了。。。而且给他峰值是100mV还会ADC10MEM显示1F9差不多是十进制500多,我参考电压3.5V啊。将近1.75V的电压怎么给他识别出来的。。。硬件电路我就将信号发生器的负端接芯片地,正端通过一个18K限流电阻接到AD口上,P1.0和P1.6是芯片上的LED连接。真心看不出程序什么错了,来个大神帮忙看下呗!
#include"msp430g2553.h"
unsigned int m=0,qushu=0,Period=0,TA_OverflowCnt,a;
void ConfigTimer()        //设置定时器
{
        TACTL=TASSEL_1+MC_2+TAIE+TACLR+ID_0;     //TA基准时钟为32768HZ、
}
int main(void)
{
WDTCTL=WDTPW+WDTHOLD;
BCSCTL1 = CALBC1_1MHZ;
DCOCTL = CALDCO_1MHZ;
ADC10CTL0 = ADC10SHT_2 + ADC10ON + ADC10IE; // ADC10ON, interrupt enabled
ADC10CTL1 = INCH_1;                       // input A1
ADC10AE0 |= 0x02;                         // PA.1 ADC option select
TA_OverflowCnt=0;
P1DIR |= 0x41;
P1OUT &=~0x41;
for (;;)
{
  ADC10CTL0 |= ENC + ADC10SC;             // Sampling and conversion start
  __bis_SR_register(CPUOFF + GIE);        // LPM0, ADC10_ISR will force exit
  if (ADC10MEM > qushu)
          qushu=ADC10MEM;                     
        else{
                ConfigTimer();
                TACTL|=TACLR;    //TA清零,重新计数
                break;}                        
}

for (;;)
{
          ADC10CTL0 |= ENC + ADC10SC;             // Sampling and conversion start
          __bis_SR_register(CPUOFF + GIE);        // LPM0, ADC10_ISR will force exit
                if(qushu<=ADC10MEM){
                        Period=TA_OverflowCnt*65536+TAR;
                        TACTL=MC_0;
                        break;}}
                a=32768/Period;
for (;;){
                if(a<2500){
                        P1OUT|=0x40; //  P1.6频率小于2500
                        P1OUT&=~0x01;}
                else{
                        P1OUT|=0x01; //  P1.0频率大于2500
                        P1OUT&=~0x40;}
}
}

//   Timer_A中断程序
#pragma vector=TIMER0_A1_VECTOR
__interrupt void Timer_A(void)
{
                switch(TA0IV)                //  TA中断方式选择
        {
                case 2:break;
                case 4:break;
                case 10: TA_OverflowCnt++;    //    溢出中断计数加1
                         break;
        }
}


// ADC10 interrupt service routine
#pragma vector=ADC10_VECTOR
__interrupt void ADC10_ISR(void)
{
  __bic_SR_register_on_exit(CPUOFF);        // Clear CPUOFF bit from 0(SR)
}

最新回复

谢谢可爱的版主们,我们用了运放 放大了峰值较小的信号,板子做出来了  ,还没来的及测试  详情 回复 发表于 2013-8-17 09:25
 
点赞 关注

回复
举报

3404

帖子

6

TA的资源

裸片初长成(初级)

沙发
 
没看明白你什么意思?检测频率一般是使用定时器的捕获或者计数功能,没明白你用ADC怎么测。

点评

版主 ,我想用MSP430测交流波形的峰峰值,想着是经过一个人全波整流后,但是还是不知道怎么测波形的波峰值,版主有什么办法能教教我吗  详情 回复 发表于 2013-8-15 20:51
 
 

回复

49

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
我这个程序是想检测波形的频率,但是检测时候方便显示结果,然后2500HZ以下P1.6驱动的LED亮否则P1.0驱动的LED亮。将正弦波通过18K限流电阻接进AD口,一直让他AD采样转换并把结果输给qushu,直到下次AD的结果ADC10MEM的值小于上次的值qushu时即检测到波峰了qushu的值就保持最大值不变了,打开计时器TA0,让他计数,然后AD继续转换,到qushu<=ADC10MEM时,就是下个峰值了,然后将计数器的TAR赋给Period,中间如果计时器有溢出的话TA_OverflowCnt+1,最后乘以65536加到Period上就是连个峰值之间的时间(一个周期的时间),然后通过这个时间算出频率。思路就这样的,版主帮忙看看呀。纠结了。。。还打算这个可以了之后,再在1602上显示频率和幅值(就是qushu)。。。
 
 
 

回复

6

帖子

0

TA的资源

一粒金砂(中级)

4
 

回复 沙发jishuaihu 的帖子

版主 ,我想用MSP430测交流波形的峰峰值,想着是经过一个人全波整流后,但是还是不知道怎么测波形的波峰值,版主有什么办法能教教我吗

点评

用精密整流电路做整流。至于精密整流电路网上多的是,其实就一个运放加一共 二极管,这样用躲过了二极管的牙将部分。最峰峰值的方法测频率我没有用过,我一般都是采用过零点来测的,把正弦波变成方波之后用单片机的  详情 回复 发表于 2013-8-16 21:31
极值就是峰值,最好用运放否则二极管压降问题不好办  详情 回复 发表于 2013-8-15 21:28
 
 
 

回复

4005

帖子

0

TA的资源

版主

5
 

回复 4楼叫我大山 的帖子

极值就是峰值,最好用运放否则二极管压降问题不好办
 
 
 

回复

3404

帖子

6

TA的资源

裸片初长成(初级)

6
 

回复 4楼叫我大山 的帖子

用精密整流电路做整流。至于精密整流电路网上多的是,其实就一个运放加一共 二极管,这样用躲过了二极管的牙将部分。最峰峰值的方法测频率我没有用过,我一般都是采用过零点来测的,把正弦波变成方波之后用单片机的捕获功能做,这样比较简单。精度和稳定性也不错。把正弦波整成方波的方法也很多,简单点儿的就是运放放大倍数大一些,最好再经过一个施密特反相器,比如74HC14,这样就比较理想了!

点评

谢谢可爱的版主们,我们用了运放 放大了峰值较小的信号,板子做出来了 ,还没来的及测试:)  详情 回复 发表于 2013-8-17 09:25
 
 
 

回复

6

帖子

0

TA的资源

一粒金砂(中级)

7
 

回复 6楼jishuaihu 的帖子

谢谢可爱的版主们,我们用了运放 放大了峰值较小的信号,板子做出来了  ,还没来的及测试
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表