⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mainboard_can_2_ricardo.c

📁 microcontroller pid implementation
💻 C
字号:
#include <p18f4580.h>
#include <stdlib.h>
#include <stdio.h>
#include <delays.h>
#include <pwm.h>
#include <timers.h>
#include <usart.h>
#include <adc.h>
#include <spi.h>
#include "ECAN.h"

#pragma config OSC=HSPLL
#pragma config PWRT = OFF
#pragma config WDT = OFF
#pragma config MCLRE = ON

#define sentido PORTAbits.RA3    //=0
#define FRENTE 0
#define TRAS 1

#define CAN_FULL 0x01
#define CAN_EMPTY 0x00

#define BUF0_FULL 0x03
#define BUF0_EMPTY 0x04

void config(void);
void comando(void);
void WriteDac(void);
void read_encoder(void);
void int_rx(void);      //FUN钦ES DAS
void desempate(void);   //   INTERRUP钦ES
void pid(void);         //

//Interrup玢o TIMER 0
#pragma code HighVector=0x08
void interrupt_high(void)
{
   _asm 
   goto desempate
   _endasm
}

//Interrup玢o recep玢o USART
#pragma code low_vector=0x18
void interrupt_low(void)
{
   _asm goto 
      int_rx 
   _endasm
}
#pragma code

unsigned char trama[20];
unsigned char indice=0,nt=0;
unsigned int vel_to_dac;
unsigned char Print_enc_vel=0;
unsigned long contador=0;      //guarda o valor actual lido do encoder
unsigned long ult_contador=0;   //guarda o ultimo valor lido do encoder
unsigned char vel_to_print = 0;
unsigned char z=0;
unsigned int velref=0;

unsigned char CAN_RECEIVE;
unsigned char BUFFER;
unsigned char vel_from_can=0;
unsigned char last_vel_from_can=0;

//vari醰eis usadas com mensagens de CAN recebidas
unsigned long idR;         //ID da mensagem recebida
unsigned char dataR[8];      //Dados da mensagem recebida
unsigned char datalenR;      //Tamanho da mensagem recebida
      
unsigned char std_ext;      //vari醰el que verifica o id da mensagem (STANDARD ou EXTENDED)
unsigned int idO;         //vari醰el que guarda o id de ORIGEM
unsigned int idD;         //vari醰el que guarda o id de DESTINO
unsigned int idF;         //vari醰el que guarda o id de FUN敲O

unsigned int velocidade=0;         //vari醰el que guarda valor da velocidade

unsigned char encoder1=0;
unsigned char encoder2=0;
unsigned char encoder3=0;
unsigned char encoder4=0;

unsigned char envia_dados_sinaletica=0;

//---vari醰eis relacionadas com o controlador PID---//
signed int erro=0;
signed int erro_ant=0;
//signed int erro_ant_ant=0;

signed int P=0;
signed int I=0;
//signed int D=0;

signed int PI=0;
signed int PI_ant=0;
signed int aux=0;
//---Valores de KP, KI e KD de ziegler-nichols---//

//controlador PI
unsigned int Kp=150;
unsigned int Ki=13;
unsigned int Kd=0;

//controlador PID
//signed long Kp=316;
//signed long Ki=29;
//signed long Kd=870;



#pragma interrupt desempate
void desempate(void){


   if (INTCONbits.TMR0IF ==1)
   {
      TMR0H = 194;         //set timer to 200ms
      TMR0L = 206;
      
      //-------Actualiza玢o do valor anterior de contagem de impulsos e leitura da velocidade actual------------//
      ult_contador = contador;
      read_encoder();
	  envia_dados_sinaletica = 1;
      vel_to_print = 1;
      
      //-----c醠culo da velocidade actual---//  
      velocidade = (unsigned int)((46 * (contador - ult_contador))/10);//velocidade em mm/s
       
      //-----chamada da fun玢o PI---//
      pid();
  
      INTCONbits.TMR0IF = 0;   //clear interrupt flag
   }

   if(PIR3bits.RXB0IF == 1)
   {
      PIR3bits.RXB0IF = 0;

      // Check if buffer is ready.
      if ( RXB0CONbits.RXFUL )
      {
            if ( COMSTATbits.RXB0OVFL )   COMSTATbits.RXB0OVFL = 0; // Forget any previous overflow
         
            std_ext = RXB0SIDLbits.EXID; //1 = extended message; 0 = standard message
            datalenR = RXB0DLC;   //n鷐ero de bytes da mensagem recebida
                  
            dataR[0] = RXB0D0;   //dados recebidos
//            dataR[1] = RXB0D1;
//            dataR[2] = RXB0D2;
//            dataR[3] = RXB0D3;
//            dataR[4] = RXB0D4;
//            dataR[5] = RXB0D5;
//            dataR[6] = RXB0D6;
//            dataR[7] = RXB0D7;
      
            RXB0CONbits.RXFUL = 0;      //Clear Receive Full Status bit (Buffer 0)
      
            idO = (RXB0SIDH & 0xf);         //id da mensagem recebida
            idD = ((RXB0SIDH & 0xf0) >> 4);
            idF = (RXB0SIDL >> 5);
               
            
            if(idD == 0xF)
            {
               if(dataR[0] == 0x02)      // TIME SLOT =2? envia vel em mm/s para WebSIM
               {
                     //Check if the Tx Buffer 0 is ready to transmit
                     if(TXB0CONbits.TXREQ == 0)
                     {
                        //(0x08 = 0000 0001 000 -> Destino: PC; Fonte: Main (0x1); Fun玢o: )
                        
                        //velocidade = 0x0101;
                        TXB0SIDH = 0b00000001;   //ID da mensagem
                        TXB0SIDL = 0b00000000;   //SIDH: SID10 - SID3; SIDL: SID2 - SID0 mais o bit EXIDE = 0 -> message will transmit standard ID
                        TXB0D0 = (velocidade/256);      //DATA da mensagem
                        TXB0D1 = (velocidade % 256);
                        TXB0DLC = 0x02;         //TAMANHO da mensagem
                        TXB0CONbits.TXREQ = 1;   //Set message for transmission
                     }
               }//end if(dataR[0] == 0x02)

				if(dataR[0] == 0x03)      // TIME SLOT =3? envia vel em mm/s e pulsos encoder para sinal閠ica
                {

					if(envia_dados_sinaletica == 1)
					{
	                    //Check if the Tx Buffer 0 is ready to transmit
	                    if(TXB0CONbits.TXREQ == 0)
	                    {
	                        //(0x308 = 0110 0001 000 -> Destino: Sinal閠ica; Fonte: Main (0x1); Fun玢o: )
	                        
	                        TXB0SIDH = 0b01100001;   //ID da mensagem
	                        TXB0SIDL = 0b00000000;   //SIDH: SID10 - SID3; SIDL: SID2 - SID0 mais o bit EXIDE = 0 -> message will transmit standard ID
							TXB0D0 = 0xFF;
							TXB0D1 = 0x0F;
	                        TXB0D2 = (velocidade/256);
	                        TXB0D3 = (velocidade % 256);
							TXB0D4 = encoder1;	//8 bits MSB
							TXB0D5 = encoder2;
							TXB0D6 = encoder3;
							TXB0D7 = encoder4;	//8 bits LSB
	                        TXB0DLC = 0x08;         //TAMANHO da mensagem
	                        TXB0CONbits.TXREQ = 1;   //Set message for transmission
						}

						envia_dados_sinaletica = 0;
					}
				}//end if(dataR[0] == 0x03)
				
            } // fecha time slot 
   
            //Mensagem recebida do PC - Velocidade
            //(0x80 = 0001 0000 000 -> Destino: Mainboard; Fonte: PC; Fun玢o: )
            

            if(idD == 0x1)
            {

            	vel_from_can= dataR[0];   
               
                if (vel_from_can != last_vel_from_can)
                {   
                     if(dataR[0] <101)
					 {
                        sentido=FRENTE;
                        velref =  dataR[0];
                        //vel_to_dac= (unsigned int) velref*34;
                        //WriteDac();      
                     }
                                 
                     if (dataR[0] >100)
                     {
                        sentido=TRAS;
                        velref =  dataR[0]-100;
                                                
                        //vel_to_dac= (unsigned int) velref*34;
                        //WriteDac();
                     }

                     last_vel_from_can = vel_from_can;
                  }      

            }    // CAN de Velocidade vindo do CAN      
      }         //fecha tratamento de teste de recep玢o CAN
   }            //fecha decis鉶 CAN

}

#pragma interruptlow int_rx
void int_rx (void)
{
   unsigned char recebeu=0;
   //PIR1bits.RCIF=0; quando a usart 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -