430 方波问题

2019-03-24 11:38发布

最近刚学习430 手上有F4250型号
想问问大家 能不能用430产生一个100K方波 然后实现相位平移呢?
或者哪位大虾可以提供以下思路,最好实现过。因为我初学有些算法还不能确定能不能做出来。
谢谢各位了 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
17条回答
wangfuchong
2019-03-26 07:56
本帖最后由 wangfuchong 于 2014-4-27 22:37 编辑

今天测试一些msp430以前有疑问未确定的特性,也就顺带写了段程序测试一下你这个问题

我用的是MSP430G2553简单型的单片机,不过TimerA应该是一样的,只不过内部CCR模块多少罢了


  1. #include "io430.h"
  2. //MSP430G2553

  3.   /* DCOCTL  Calibration Data for 16MHz */
  4. __no_init volatile unsigned __READ char CALDCO_16MHZ @ 0x10F8;
  5.   /* BCSCTL1 Calibration Data for 16MHz */
  6. __no_init volatile unsigned __READ char CALBC1_16MHZ @ 0x10F9;

  7. volatile signed char step=1;//控制移相步进,数值要小 ,否则会出错。最好也就是1,2,3之类 ,能多大要计算和试验


  8. int main( void )
  9. {
  10.   // Stop watchdog timer to prevent time out reset
  11.   WDTCTL = WDTPW + WDTHOLD;
  12.   
  13.   P1OUT = 0;
  14.   P1DIR = BIT0 + BIT1 + BIT2 + BIT3 + BIT4 + BIT5 + BIT6 + BIT7;
  15.   P1IES = 0;
  16.   P1IFG = 0;
  17.   
  18.   P2OUT = 0;
  19.   P2SEL = BIT2 + BIT4;//定时器的TA1CCR1和TACCR2的输出,也就是输出两个方波的引脚
  20.   P2DIR = BIT0 + BIT1 + BIT2 + BIT3+BIT4 + BIT5 + BIT6 + BIT7;
  21.   P2IES = 0;
  22.   P2IFG = 0;
  23.   P3OUT = 0;
  24.   P3DIR = BIT0 + BIT1 + BIT2 + BIT3 + BIT4 + BIT5 + BIT6 + BIT7;
  25.   
  26.   BCSCTL2 = SELM_0 + DIVM_0 + DIVS_0;
  27.   if (CALBC1_16MHZ != 0xFF)
  28.   {
  29.     DCOCTL = 0x00;
  30.     BCSCTL1 = CALBC1_16MHZ;      
  31.     DCOCTL = CALDCO_16MHZ;
  32.   }
  33.   BCSCTL1 |= XT2OFF + DIVA_0;
  34.   BCSCTL3 = XT2S_0 + LFXT1S_2;
  35.   
  36.   __delay_cycles(8000000);
  37.   __bis_SR_register(GIE);
  38.   
  39.   TA1CCR0 =79;//MCLK=SMCLK=16MHz,所以定时器时钟也是16MHz,输出模式4,所以要多除以2
  40.   //TA1CCTL0=CCIE;
  41.   TA1CCTL1 = OUTMOD_4;
  42.   TA1CCR1 = 39;
  43.   TA1CCTL2=OUTMOD_4+CCIE;
  44.   TA1CCR2 = 39;
  45.   TA1CTL = TASSEL_2 + ID_0 + MC_1;
  46.   
  47.   while(1)
  48.   {
  49.     __no_operation();
  50.   }
  51.    
  52.   return 0;
  53. }

  54. #pragma vector=TIMER1_A1_VECTOR
  55. __interrupt void TIMER1_A1_ISR_HOOK(void)
  56. {
  57.   //static unsinged char step=1;//进入中断实际上定时器已经过了几个TACLK,因为TACLK等于MCLK,很快。所以CCRX加一个很小的数值应该不会引起突变
  58.   static unsigned char count=0;
  59.   static unsigned int countLong=0;//countLong仅仅是我为了在老旧模拟示波器上观看,用数字示波器可删除countLong及相关。
  60.   countLong++;
  61.   if(countLong>1000)
  62.   {
  63.     TA1CCR2+=step;
  64.     if(TA1CCR2>TA1CCR0)
  65.     {
  66.       if(step>0)
  67.       {
  68.         TA1CCR2=0;//TA1CCR2-TA1CCR0-1;
  69.       }
  70.       else if(step<0)
  71.       {
  72.         TA1CCR2=79;//TA1CCR2+TA1CCR0+1;
  73.       }
  74.     }
  75.    
  76.     count++;
  77.     if(count>156)
  78.     {
  79.       if(step>0) step=-1;
  80.       else step=1;
  81.       count=0;
  82.     }
  83.     countLong=0;
  84.   }
  85.   TA1CCTL2&=~CCIFG;
  86. }
复制代码
演示视频:



用模拟示波器演示了一下,没有数字示波器,用一个网上几十元的所谓逻辑分析仪看了一下,也没看到突变,不过您还得用数字示波器才能确定一下吧。点击图片可看大图放大
捕获2.JPG


不知道您的应用是什么?我想一般在主程序中根据反馈设定step为-1,0,1即可吧?一般不需要多大的步进吧?

关键的要点就是:进入中断实际上定时器已经过了几个TACLK,因为TACLK等于MCLK,很快。所以CCRX加一个很小的数值应该不会引起突变



一周热门 更多>

相关问题

    相关文章