找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1522|回复: 0
收起左侧

MSP430实现PI控制单闭环调速

[复制链接]
ID:578838 发表于 2019-7-6 10:39 | 显示全部楼层 |阅读模式



#include <msp430x14x.h>
#include "Config.h"                     //开发板配置头文件,主要配置IO端口信息
#include "LCD1602.c"  
#define uchar unsigned char
#define uint  unsigned int
#define ulong unsigned long
uint count=0;
float sv=0;
float sv1=0;
float ev=0;
float v=0;
float p=0;
int i=0;
float jifen=0;

void Port_Init()
{
        P1SEL &= ~(BIT0+BIT4+ BIT5+BIT6+BIT7);                    //设置IO口为普通I/O模式
        P1DIR &= ~ (BIT0+BIT4+ BIT5+BIT6+BIT7);                 //设置IO口方向为输入
        P1IE|=(BIT0+BIT4+BIT5+BIT6+BIT7);
        P1IES|=(BIT0+BIT4+BIT5+BIT6+BIT7);
        P1IFG&=~(BIT0+BIT4+BIT5+BIT6+BIT7);

}


void PID()
{
   sv=4.0*count/600*60;
   count=0;
   ev=sv1-sv;

   v=5.5*ev;
   TACCR1=TACCR1+v;

   if((-200<ev)&&(ev<200))      
{

jifen=jifen+ev;
jifen=jifen>=6000?6000:jifen;  
}

else

{
  jifen=0;
}

    TACCR1=TACCR1+v*10+(int)(jifen);


   if(TACCR1>=10000)
   {
     TACCR1=10000;
   }

}

void PWM_Init(void)                     //产生10KHZ、占空比为50%的PWM信号
{
  P1SEL |= BIT2;                        //P12口输出PWM信号
  P1DIR |= BIT2;                        //P12口接入一个LED发光二极管
  TACCR0 = 10000;                         //CCR0
  TACCR1 = 0;                         //CCR1,占空比50%,可以更改,LED灯亮度会变化
  TACCTL1 = OUTMOD_7 ;//复位/置位
  TACTL |= TASSEL_2 + MC_1+ID_3;             //SMCLK做时钟源,1分频,增加计数模式

}


void TIMEB_INIT(void)
{
TBCTL |= TBSSEL_2 + MC_1+ID_3+TBCLR+TBIE;
TBCCR0 = 9999;
}

void main(void)
{
  Clock_Init();
  WDTCTL=WDT_ADLY_250;              //看门狗设置
  IE1|=WDTIE;                         //系统时钟设置
  Port_Init();                          //端口初始化
  Close_LED();                          //关闭数码管显示
  PWM_Init();                           //设置TIMERA,P12输出PWM信号
  _EINT();


     LCDPort_init();
     delay_ms(100);                      //延时100ms
     LCD_init();                         //液晶参数初始化设置
     LCD_clear();   


  while(1)                              //无限循环
    {

       uchar display[6]={0, 0, 0,0,0,0};
        LCD_write_str(0,0,"n0=");
        LCD_write_str(0,1,"n1=");
        display[0]=((uint)sv)%10;
        display[1]=((uint)sv)/10%10;
        display[2]=((uint)sv)/100;
        //display[3]=((uint)sv)/1000%10;
        //display1[0]=((uint)TACCR1)/10000;


        display[3]=((uint)sv1)%10;
        display[4]=((uint)sv1)/10%10;
        display[5]=((uint)sv1)/100;

        LCD_write_char(4,0, display[2]+0x30);
        LCD_write_char(5,0, display[1]+0x30);
        LCD_write_char(6,0, display[0]+0x30);
       //LCD_write_char(7,0, display[1]+0x30);
        //LCD_write_char(8,0, display[0]+0x30);


        LCD_write_char(4,1, display[5]+0x30);
        LCD_write_char(5,1, display[4]+0x30);
        LCD_write_char(6,1, display[3]+0x30);
        if ((P1IN & BIT4)==0x00)
   {
        delay_ms(20);
        if ((P1IN & BIT4)==0x00)
      {
          TACCR1 = 0;      
      }
        while(!(P1IN & BIT4));  
   }

   if ((P1IN & BIT5)==0x00)
   {
        delay_ms(20);
        if ((P1IN & BIT5)==0x00)
      {
          TACCR1 = 5000;  
          sv1=330;
      }
        while(!(P1IN & BIT5));  
   }


   if ((P1IN & BIT6)==0x00)
   {
        delay_ms(20);
        if ((P1IN & BIT6)==0x00)
      {

        sv1=sv1+10;//if(TACCR1<=55000)
            //TACCR1 = TACCR1+5000;
         // else
            //TACCR1 = 60000;   
      }
        while(!(P1IN & BIT6));  
   }



   if ((P1IN & BIT7)==0x00)
   {
        delay_ms(20);
        if ((P1IN & BIT7)==0x00)
      {

        sv1=sv1-10;//if(TACCR1>=5000)
       //TACCR1 = TACCR1-5000;
     // else
       //TACCR1 =0;     
      }
        while(!(P1IN & BIT7));  
   }

    }
}



#pragma vector =PORT1_VECTOR
__interrupt void Port1_ISR(void)
{

  if ((P1IFG |0xFE)==0xFF)
       {
         count++;
       }
   P1IFG=0;
}

#pragma vector =WDT_VECTOR
__interrupt void WDT_IRQ(void)
{   

     PID();

}

回复

使用道具 举报

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

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表