MSP430 LauchPad单片机学习板怎么进行脉冲计数,并显示出来

2019-03-24 10:49发布

求大家给点建议和经验,完全新手,在做一个成果!!
怎么利用MSP430 LauchPad单片机学习板接受方波,对他的脉冲进行计数,并用LED显示出来!!谢谢!!
此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
王项电子
1楼-- · 2019-03-24 16:13
设置IO口为输入,设置中断边沿,允许中断,开启总中断,OK.在中断函数中计数。
Summer小姐!
2楼-- · 2019-03-24 16:40
 精彩回答 2  元偷偷看……
王项电子
3楼-- · 2019-03-24 16:56

  1. #include "msp430g2553.h"
  2. #include "uart.h"
  3. #include "mpu6050.h"
  4. #include "stdio.h"
  5. #include "string.h"


  6. static unsigned char ms10;
  7. unsigned int second,ms11;

  8. static unsigned char EnableMeasureSpeed=0;                      //周期性测速标志//
  9. static unsigned int LeftMotorSpeed,RightMotorSpeed;             //测量电机速度缓存//
  10. unsigned int SystemLeftSpeed,SystemRightSpeed;                  //实际左右电机速度//      
  11. //int PidOut,Error;
  12. int LeftPIDOut,RightPIDOut;                                      //左右电机PID计算结果//

  13. //左电机方向控制接口  
  14. //做电机方向控制接线:
  15. //绿线:P23, 蓝线:P25
  16. //左电机速度输出线为棕 {MOD} 接在P13
  17. //左电机速度控制线为黄 {MOD},在P24
  18. #define LeftMotorForward {P2OUT &= ~BIT3;P2OUT |=  BIT5;}
  19. #define LeftMotorReverse {P2OUT |=  BIT3;P2OUT &= ~BIT5;}

  20. //右电机方向控制接口:
  21. //右电机方向控制接线:
  22. //蓝线:P22 黄线:P20
  23. //右电机速度输出线颜 {MOD}为:黑 {MOD} 接在P14
  24. //右电机速度控制线为绿 {MOD},在P21//
  25. #define RightMotorForward {P2OUT &= ~BIT0;P2OUT |=  BIT2;}
  26. #define RightMotorReverse {P2OUT |=  BIT0;P2OUT &= ~BIT2;}

  27. //电机方向控制IO初始化//
  28. void InitMotorControlIO()
  29. {
  30.   P2DIR |= BIT0 + BIT2 + BIT3 +BIT5;            //设置为输出//
  31.   //P2REN |= BIT0 + BIT2 + BIT3 +BIT5;            //开启上拉//
  32.   
  33. }

  34. //看门狗定时器产生1ms中断//
  35. void WDTplus_graceInit(void)
  36. {   
  37.     WDTCTL = WDTPW | WDTTMSEL | WDTIS0;
  38.     IE1 |= WDTIE;
  39.     //P1DIR |=BIT0; //在P10测试脉冲周期为500hz//
  40. }

  41. //mclk=16MHz DCO
  42. //SMCLK=8MHz
  43. //ACLK=32.768KHz

  44. void BCSplus_graceInit(void)
  45. {
  46.     /* USER CODE START (section: BCSplus_graceInit_prologue) */
  47.     /* User initialization code */
  48.     /* USER CODE END (section: BCSplus_graceInit_prologue) */

  49.     /*
  50.      * Basic Clock System Control 2
  51.      *
  52.      * SELM_0 -- DCOCLK
  53.      * DIVM_0 -- Divide by 1
  54.      * ~SELS -- DCOCLK
  55.      * DIVS_1 -- Divide by 2
  56.      * ~DCOR -- DCO uses internal resistor
  57.      *
  58.      * Note: ~<BIT> indicates that <BIT> has value zero
  59.      */
  60.     BCSCTL2 = SELM_0 | DIVM_0 | DIVS_1;

  61.     if (CALBC1_16MHZ != 0xFF) {
  62.         /* Adjust this accordingly to your VCC rise time */
  63.         __delay_cycles(100000);

  64.         /* Follow recommended flow. First, clear all DCOx and MODx bits. Then
  65.          * apply new RSELx values. Finally, apply new DCOx and MODx bit values.
  66.          */
  67.         DCOCTL = 0x00;
  68.         BCSCTL1 = CALBC1_16MHZ;     /* Set DCO to 16MHz */
  69.         DCOCTL = CALDCO_16MHZ;
  70.     }

  71.     /*
  72.      * Basic Clock System Control 1
  73.      *
  74.      * XT2OFF -- Disable XT2CLK
  75.      * ~XTS -- Low Frequency
  76.      * DIVA_0 -- Divide by 1
  77.      *
  78.      * Note: ~XTS indicates that XTS has value zero
  79.      */
  80.     BCSCTL1 |= XT2OFF | DIVA_0;

  81.     /*
  82.      * Basic Clock System Control 3
  83.      *
  84.      * XT2S_0 -- 0.4 - 1 MHz
  85.      * LFXT1S_2 -- If XTS = 0, XT1 = VLOCLK ; If XTS = 1, XT1 = 3 - 16-MHz crystal or resonator
  86.      * XCAP_1 -- ~6 pF
  87.      */
  88.     BCSCTL3 = XT2S_0 | LFXT1S_2 | XCAP_1;

  89.     /* USER CODE START (section: BCSplus_graceInit_epilogue) */
  90.     /* User code */
  91.     /* USER CODE END (section: BCSplus_graceInit_epilogue) */
  92. }

  93. /*void UpdataMotorSpeed(unsigned char channel,unsigned int MotorSpeed)
  94. {
  95.   unsigned char SpeedH,SpeedL;
  96.   SpeedL=(MotorSpeed);
  97.     SpeedH=MotorSpeed>>=8;
  98.    UARTPutChar(0x88);
  99.    UARTPutChar(channel);
  100.    UARTPutChar(2);
  101.    UARTPutChar(SpeedH);
  102.    UARTPutChar(SpeedL);
  103.    UARTPutChar(SpeedL+SpeedH+0x88+0xa1+2);
  104. }*/

  105. //ccr1对应着P21的输出
  106. //CCR2对应着P24的输出//
  107. void Timer1_A3_graceInit(void)
  108. {               
  109.   
  110.   
  111.     P2DIR |= BIT1+BIT4;                 //设置为输出方向//
  112.     P2OUT &= ~(BIT1+BIT4);
  113.     P2SEL |= BIT1+BIT4;                 //选择为第二功能//
  114.    
  115.     /* USER CODE START (section: Timer1_A3_graceInit_prologue) */
  116.     /* User initialization code */
  117.     /* USER CODE END (section: Timer1_A3_graceInit_prologue) */
  118.    
  119.     /*
  120.      * TA1CCTL1, Capture/Compare Control Register 1
  121.      *
  122.      * CM_0 -- No Capture
  123.      * CCIS_0 -- CCIxA
  124.      * ~SCS -- Asynchronous Capture
  125.      * ~SCCI -- Latched capture signal (read)
  126.      * ~CAP -- Compare mode
  127.      * OUTMOD_7 -- PWM output mode: 7 - PWM reset/set
  128.      *
  129.      * Note: ~<BIT> indicates that <BIT> has value zero
  130.      */
  131.     TA1CCTL1 = CM_0 | CCIS_0 | OUTMOD_7;

  132.     /*
  133.      * TA1CCTL2, Capture/Compare Control Register 2
  134.      *
  135.      * CM_0 -- No Capture
  136.      * CCIS_0 -- CCIxA
  137.      * ~SCS -- Asynchronous Capture
  138.      * ~SCCI -- Latched capture signal (read)
  139.      * ~CAP -- Compare mode
  140.      * OUTMOD_7 -- PWM output mode: 7 - PWM reset/set
  141.      *
  142.      * Note: ~<BIT> indicates that <BIT> has value zero
  143.      */
  144.     TA1CCTL2 = CM_0 | CCIS_0 | OUTMOD_7;

  145.     /* TA1CCR0, Timer_A Capture/Compare Register 0 */
  146.     TA1CCR0 = 15999;

  147.     /* TA1CCR1, Timer_A Capture/Compare Register 1 */
  148.     //TA1CCR1 = 16000;
  149.     TA1CCR1 = 1600;

  150.     /* TA1CCR2, Timer_A Capture/Compare Register 2 */
  151.     TA1CCR2 = 15999;

  152.     /*
  153.      * TA1CTL, Timer_A3 Control Register
  154.      *
  155.      * TASSEL_2 -- SMCLK
  156.      * ID_0 -- Divider - /1
  157.      * MC_1 -- Up Mode
  158.      */
  159.     TA1CTL = TASSEL_2 | ID_0 | MC_1;

  160.     /* USER CODE START (section: Timer1_A3_graceInit_epilogue) */
  161.     /* User code */
  162.     /* USER CODE END (section: Timer1_A3_graceInit_epilogue) */
  163. }
  164. //------------------------------------------------------------------------------//
  165. //PID控制电机结构体//
  166. typedef struct PID {

  167.         int  SetPoint;           //  设定目标 Desired Value

  168.         int  Proportion;         //  比例常数 Proportional Const
  169.         int  Integral;           //  积分常数 Integral Const
  170.         int  Derivative;         //  微分常数 Derivative Const

  171.         int  LastError;          //  Error[-1]
  172.         int  PrevError;          //  Error[-2]
  173.         int  SumError;           //  Sums of Errors

  174. } PID;
  175. PID  LeftPID,RightPID;                   //  LeftMotor PID Control Structure
  176. //---------------------------------------------//
  177. //PID计算//
  178. int PIDCalc( PID *pp, int NextPoint )
  179. {
  180.         static int  dError,Error;
  181.         
  182.         Error = pp->SetPoint -  NextPoint;          // 偏差
  183.         
  184.         pp->SumError += Error;                      // 积分
  185.         
  186.         dError = pp->LastError - pp->PrevError;     // 当前微分
  187.         
  188.         pp->PrevError = pp->LastError;      
  189.         pp->LastError = Error;
  190.         
  191.         return (pp->Proportion * Error              // 比例项
  192.             +   pp->Integral * pp->SumError         // 积分项
  193.             +   pp->Derivative * dError             // 微分项
  194.               );
  195. }
  196. //----------------------------------------//
  197. void PIDInit (PID *pp)
  198. {
  199.     memset ( pp,0,sizeof(PID));//清零PID存储//
  200. }

  201. //-----------------------------------------//
  202. //--------------------------------------------------------------------------------//
  203. int main( void )
  204. {
  205. // unsigned int CheckUart;
  206.   
  207.   WDTplus_graceInit();
  208.   BCSplus_graceInit();
  209.   UartInit();
  210.   //MPU6050Init();
  211.   Timer1_A3_graceInit();
  212.   InitMotorControlIO();
  213.   LeftMotorReverse;
  214.   RightMotorReverse;
  215.   
  216.   PIDInit ( &LeftPID );                  //  Initialize Structure
  217.   PIDInit (&RightPID);                   //  Initialize Structure
  218.   LeftPID.Proportion     =900;               //  Set PID Coefficients
  219.   LeftPID.Integral       = 50;
  220.   LeftPID.Derivative     = 0;
  221.   LeftPID.SetPoint       = 1;               //  Set LeftMotor PID Setpoint
  222.   
  223.   RightPID.Proportion    =900;
  224.   RightPID.Integral      =50;
  225.   RightPID.Derivative    =0;
  226.   RightPID.SetPoint      =2;
  227.    
  228.   P1DIR |= BIT0;                                  //P10设置为输出//
  229.   P1DIR &= ~BIT3;                                 //P13设置为输入//
  230.   P1DIR &= ~BIT4;                                 //P14设置为输入//
  231.   P1IES |= BIT3;                                 // 上升沿中断   P1IES &= ~BIT3;下降沿中断//
  232.   P1IES |= BIT4;                                 //P14上升沿中断//
  233.   P1SEL &= ~BIT3;                               //P13选择为IO//
  234.   P1SEL &= ~BIT4;
  235.   P1REN |= BIT3;                                //开启上拉//
  236.   P1REN |= BIT4;                                //p14开启上拉//
  237.   //P1IE |=  BIT3;                                 //中断使能//               
  238.   P1IFG =0;                                     //中断标志位清零//
  239.   _EINT();                                      //全局中断使能//

  240.   while(1)
  241.   {  
  242.       Channel_monitor(0xa1,SystemLeftSpeed*400,SystemRightSpeed*400);
  243.       Channel_monitor(0xa2,LeftPIDOut,RightPIDOut);
  244.   }
  245. }
  246. #pragma vector=PORT1_VECTOR
  247. __interrupt void Port_1(void)
  248. {
  249.   if(EnableMeasureSpeed==BIT0)
  250.   {
  251.    switch(P1IFG)
  252.    {
  253.       case BIT3:                                        //左轮速度输出脉冲接P13//
  254.         {
  255.           LeftMotorSpeed++;
  256.           P1OUT ^= BIT0;
  257.           P1IFG =0;                           // 清除中断标志//
  258.           break;
  259.         }
  260.       case BIT4:                                        //右轮速度输出脉冲接P14//
  261.         {
  262.           RightMotorSpeed++;
  263.           P1OUT ^= BIT0;
  264.           P1IFG =0;                           // 清除中断标志//
  265.           break;
  266.         }
  267.       case (BIT3+BIT4):                                 //同时中断//
  268.         {
  269.           LeftMotorSpeed++;         
  270.           RightMotorSpeed++;
  271.           P1IFG =0;                           // 清除中断标志//
  272.           break;
  273.         }
  274.    default:break;
  275.    }
  276.   }
  277.   P1IFG =0;                           // 清除中断标志//
  278. }

  279. //每1ms中断//
  280. #pragma vector=WDT_VECTOR
  281. __interrupt void WDT_ISR_HOOK(void)
  282. {
  283.   ms10++;
  284.   second++;
  285.   ms11++;
  286.   if(ms10==10)
  287.   {
  288.     //P1OUT ^= BIT0;
  289.     ms10=0;
  290.     EnableMeasureSpeed^=BIT0;
  291.      if(EnableMeasureSpeed==BIT0)                                 //开启测速//
  292.       {
  293.           LeftMotorSpeed=0;                                      //清零左轮速度//
  294.           RightMotorSpeed=0;                                     //清零右轮速度//
  295.           P1IE |= BIT3;                                          //中断使能//       
  296.           P1IE |= BIT4;
  297.       }
  298.      else      
  299.        if(EnableMeasureSpeed==0)                                //测速完成//
  300.         {
  301.           SystemLeftSpeed=LeftMotorSpeed;                        //更新左轮速度值//
  302.           SystemRightSpeed=RightMotorSpeed;                      //更新右轮速度值//
  303.           //Updata_Left(SystemLeftSpeed);
  304.           LeftMotorSpeed=0;                                     //清空左轮速度缓冲//   
  305.           RightMotorSpeed=0;                                     //清空右轮速度缓冲//
  306.           P1IE &=~(BIT3+BIT4);                 //停止测速,直至下一个测速周期//
  307.         }
  308.     }
  309.   
  310.     if(second==1000)    //一秒中断执行程序//
  311.     {
  312.       second=0;
  313.     }
  314.   
  315.   if(ms11==11)
  316.   {
  317.     ms11=0;
  318.    LeftPIDOut   =PIDCalc(&LeftPID,SystemLeftSpeed);
  319.    RightPIDOut  =PIDCalc(&RightPID,SystemRightSpeed);
  320.    
  321.    if(LeftPIDOut>=16000)
  322.      TA1CCR2=16000;
  323.    if(LeftPIDOut<=0)
  324.      TA1CCR2=0;
  325.     else
  326.       {
  327.        TA1CCR2=LeftPIDOut;
  328.       }
  329.    
  330.     if(RightPIDOut>=16000)
  331.      TA1CCR1=16000;
  332.     if(RightPIDOut<=0)
  333.      TA1CCR1=0;
  334.     else
  335.       {
  336.        TA1CCR1=RightPIDOut;
  337.       }
  338.   }
  339. }
复制代码
qiushenghua
4楼-- · 2019-03-24 20:18
你的Launchpad使用的是什么单片机?G2231 G2211还是G2452 G2553?
使用的是什么样的LED?一般我们说的LED是发光二极管,你用的该不会是数码管吧?还是LCD?
然后就是程序结构了。MSP430本身能够对上升沿、下降沿、高电平、低电平等根据实际需要产生中断信号。你既然要测量脉冲信号,那么可以选择上升沿或者下降沿作为中断触发。
如果你只是为了计数,那么有没有什么时间限制?如果没有,那么单片机可以从0开始计数,直到你的显示设备超出上限。
中断服务里只需要写一句count++就可以了,这里的count需要是初始化后的全局变量。然后主循环里可以不断的实现数字的显示与刷新。如果使用LCD屏,那么请看LCD控制器的时序要求,如果使用的是数码管,请看数码管的显示方法。这些东西网上一搜一大把的。

一周热门 更多>

相关问题

    相关文章