欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1601|回復(fù): 0
收起左側(cè)

MSP430實(shí)現(xiàn)PI控制單閉環(huán)調(diào)速

[復(fù)制鏈接]
ID:578838 發(fā)表于 2019-7-6 10:39 | 顯示全部樓層 |閱讀模式



#include <msp430x14x.h>
#include "Config.h"                     //開發(fā)板配置頭文件,主要配置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);                    //設(shè)置IO口為普通I/O模式
        P1DIR &= ~ (BIT0+BIT4+ BIT5+BIT6+BIT7);                 //設(shè)置IO口方向?yàn)檩斎?
        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)                     //產(chǎn)生10KHZ、占空比為50%的PWM信號
{
  P1SEL |= BIT2;                        //P12口輸出PWM信號
  P1DIR |= BIT2;                        //P12口接入一個(gè)LED發(fā)光二極管
  TACCR0 = 10000;                         //CCR0
  TACCR1 = 0;                         //CCR1,占空比50%,可以更改,LED燈亮度會(huì)變化
  TACCTL1 = OUTMOD_7 ;//復(fù)位/置位
  TACTL |= TASSEL_2 + MC_1+ID_3;             //SMCLK做時(shí)鐘源,1分頻,增加計(jì)數(shù)模式

}


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

void main(void)
{
  Clock_Init();
  WDTCTL=WDT_ADLY_250;              //看門狗設(shè)置
  IE1|=WDTIE;                         //系統(tǒng)時(shí)鐘設(shè)置
  Port_Init();                          //端口初始化
  Close_LED();                          //關(guān)閉數(shù)碼管顯示
  PWM_Init();                           //設(shè)置TIMERA,P12輸出PWM信號
  _EINT();


     LCDPort_init();
     delay_ms(100);                      //延時(shí)100ms
     LCD_init();                         //液晶參數(shù)初始化設(shè)置
     LCD_clear();   


  while(1)                              //無限循環(huán)
    {

       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();

}

回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表