MSP430采样与定时器的问题

2019-03-24 08:50发布

本帖最后由 905105948 于 2016-11-19 23:22 编辑

项目需要一个定时器10us一次中断计时间,然后定时器里判断时间,每250us adc采样一次(单通道单次采样),这个方式下,原本采样完8000次,用时应该是2s(250*8000us),结果自己掐表8s多,是否由于定时器中断太多,导致采样耗费时间了,将定时器中断改成50us的话,再测试采样那么多数据,掐表2s多,这个暂时认为比较准确,但是定时器的50us,时间太长,需要10us精度的计时,不知道有没有什么更好的办法控制adc采样,又不耽误计时。10us计时下开adc的中断,由于定时器中断优先级高,次数又太快,adc中断无法进入。照理来说adc最少需要3+13个ADC时钟,不会达到10us这么长时间的呀?求指教。单片机是MSP430FR5949,内部16MHz的DCO作为时钟。
下面是直接在定时器里去采样的,没有用ADC中断的方式。
定时器配置。
  1. void TimerB0_Init(uint16_t t)
  2. {      
  3.   TB0CCTL0 = CCIE;                          // TBCCR0 interrupt enabled
  4.   TB0CCR0 = 160;                             //  10us  
  5.   TB0CTL = TBSSEL__SMCLK | MC__UP;          // SMCLK, 16M UP mode
  6. }
复制代码

定时器中断
  1. /*定时器B0中断服务函数*/
  2. #pragma vector = TIMER0_B0_VECTOR
  3. __interrupt void Timer0_B0_ISR(void)
  4. {
  5.       RealTime.u10us++;         //10US
  6.       
  7.       if(RealTime.u10us==100000)
  8.       {
  9.           RealTime.u10us=0;
  10.           RealTime.usec++;
  11.           if(RealTime.usec==60)
  12.           {
  13.               RealTime.usec=0;
  14.               RealTime.umin++;
  15.               if(RealTime.umin==60)
  16.               {
  17.                   RealTime.umin=0;
  18.                   RealTime.uhour++;
  19.                   if(RealTime.uhour==24)
  20.                   {
  21.                       RealTime.uhour=0;
  22.                   }
  23.               }
  24.           }
  25.          
  26.       }
  27.       if(RealTime.u10%25==0)//250us采样一次
  28.       {  
  29.         A9_sample_start();
  30.       }

  31. }
复制代码ADC配置
  1. void ADC_Init(void)
  2. {
  3.   

  4.   while(REFCTL0 & REFGENBUSY);              // If ref generator busy, WAIT
  5.   REFCTL0 |= REFVSEL_2 | REFON;             // Select internal ref = 2.5V
  6.                                             // Internal Reference ON
  7.   // Configure ADC12
  8.   //ADC12CTL0 = ADC12ON | ADC12SHT0_2;        // Turn on ADC12, set sampling time
  9.   ADC12CTL0 |= ADC12ON + ADC12SHT0_2+ADC12SHT1_2;
  10.   //ADC12CTL1 = ADC12SHP;
  11.   ADC12CTL1 = ADC12SHP | ADC12SSEL_3 ;       // Use sampling clock SMCLK 16M;

  12.   ADC12CTL3 &= 0xFFE0;
  13.   ADC12CTL3 |= ADC12CSTARTADD_9;
  14.   ADC12MCTL9 = ADC12INCH_9 | ADC12VRSEL_1;
  15.   
  16.   ADC12CTL0 |= ADC12ENC;
  17.   
  18.   //ADC12IFGR0 = BIT9;

  19. }
复制代码

ADC采样
  1. void A9_sample_start(void)
  2. {
  3.       //while(REFCTL0 & REFGENBUSY);              // If ref generator busy, WAIT
  4.       //REFCTL0 |= REFVSEL_2 | REFON;             // Select internal ref = 2.5V
  5.                                                 // Internal Reference ON
  6.       // Configure ADC12
  7.       //ADC12CTL0 = ADC12ON | ADC12SHT0_2;        // Turn on ADC12, set sampling time
  8.       //ADC12CTL1 = ADC12SHP;
  9.       //ADC12CTL1 = ADC12SHP | ADC12SSEL_3 ;       // Use sampling clock SMCLK 8M;

  10.       //ADC12CTL3 &= 0xFFE0;
  11.       //ADC12CTL3 |= ADC12CSTARTADD_9;
  12.       //ADC12MCTL9 &= 0xFFE0;//先清空原来的值
  13.       //ADC12MCTL9 |= ADC12INCH_9 | ADC12VRSEL_1;
  14.       ADC12CTL0 |= ADC12SC;
  15.       
  16.       while (!(ADC12IFGR0 & BIT9));
  17.       __data20_write_short(Cur_Addr+position,ADC12MEM9);
  18.       //ADC12CTL0 &=~ (ADC12ENC + ADC12SC);
  19.       position+=2;
  20.       if(position==0x4000)
  21.         position=0;
  22. }
复制代码







此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
3条回答
数码小叶
1楼-- · 2019-03-24 11:15
第一,““定时器中断太多,导致采样耗费时间了””很明显中断函数你写的不合理,中断失去意义了。
第二,你的设置啥都没说,型号也不说,G2系列,最少需要4+13 ADCLK,就拿13来算吧,13X0.2us=2.6us,在10内啊,更加说明你的中断写的不合理了,还有这么极限的时间,能保证准确率不,怀疑
905105948
2楼-- · 2019-03-24 12:43
 精彩回答 2  元偷偷看……
数码小叶
3楼-- · 2019-03-24 16:29
905105948 发表于 2016-11-19 23:20
相关的代码已经上传。麻烦帮忙看一下,感谢

AD时间是16+13=29,29X0.2=5.8us,你的系统主时钟是1M的,那中断肯定就不行了,看注释,猜是16M的,那应该没啥问题。。。。。下午回来再看下

一周热门 更多>

相关问题

    相关文章