You are on page 1of 8

#include "hw_memmap.

h"

#include "hw_types.h"

#include "hw_timer.h"

#include "hw_ints.h"

#include "gpio.h"

#include "sysctl.h"

#include "uartstdio.h"

#include "uart.h"

#include "pwm.h"

#include "pin_map.h"

#include "timer.h"

#include "stdio.h"

#include "string.h"

#include "stdlib.h"

#include "math.h"

#include "interrupt.h"

#include "lm4f120h5qr.h"

#include"ssi.h"

#include "math.h"

#include <stdio.h>

#include "watchdog.h"

#include "fpu.h"

#include "adc.h"

void config_Timer_Amostra(void);

void Trapezio(void);
void config_TimerADC(void);

void INT_ADC(void);

void config_ADC(void);

void config_PWM(void);

double DUTYCycleRef[400];

double Up[400];

double Ui[400];

double Ud[400];

double Upid[400];

double Erro[400];

unsigned long Valor_ADC;

double ulPeriod;

double dutyCycle,rampa;

int i=1,t=1,g=1,c=1,d=1,x=1;

double PERIODO = 3000;//3998;

int main(void) {

FPUEnable();

rampa = (PERIODO)/30;//133;
// 40 MHz system clock

SysCtlClockSet(SYSCTL_SYSDIV_5|SYSCTL_USE_PLL|SYSCTL_XTAL_16MHZ|SYSCTL_OSC_MAIN)
;

config_PWM();

config_Timer_Amostra();

config_ADC();

config_TimerADC();

do{

}while(1);

void config_PWM(void){

ulPeriod =3999;//6665

SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);

SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE);

GPIOPinConfigure(GPIO_PB6_T0CCP0);

GPIOPinTypeTimer(GPIO_PORTB_BASE, GPIO_PIN_6);

SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0);
TimerConfigure(TIMER0_BASE, TIMER_CFG_SPLIT_PAIR|TIMER_CFG_A_PWM);

TimerControlLevel(TIMER0_BASE,TIMER_A,true);//inverte PWM

TimerLoadSet(TIMER0_BASE, TIMER_A, ulPeriod);

TimerMatchSet(TIMER0_BASE, TIMER_A, dutyCycle); // PWM

TimerEnable(TIMER0_BASE, TIMER_A);

void config_ADC(void){

//base,sequencia_usada,trigger,prioridade

SysCtlPeripheralEnable(SYSCTL_PERIPH_ADC0);

SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE);

GPIOPinTypeADC(GPIO_PORTE_BASE,GPIO_PIN_2);//CANAL DO AD

ADCIntClear(ADC0_BASE, 0);

ADCSequenceConfigure(ADC0_BASE,3, ADC_TRIGGER_TIMER,0);

ADCSequenceStepConfigure(ADC0_BASE,3,0,ADC_CTL_CH1 |ADC_CTL_IE
|ADC_CTL_END);//PE2 in ADC

ADCSequenceEnable(ADC0_BASE,3);

ADCIntEnable(ADC0_BASE,3);

void config_TimerADC(void){

SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER1);

TimerConfigure(TIMER1_BASE, TIMER_CFG_32_BIT_PER);

TimerLoadSet(TIMER1_BASE,TIMER_A,3999);//10kHz

TimerControlTrigger(TIMER1_BASE,TIMER_A,true);

TimerEnable(TIMER1_BASE, TIMER_A);
IntEnable(INT_TIMER1A);

IntEnable(INT_ADC0SS3);

ADCIntClear(ADC0_BASE, 0);

void INT_ADC(void){

ADCIntClear(ADC0_BASE,3);//Limpa interrupcao do ADC

ADCSequenceDataGet(ADC0_BASE,3,&Valor_ADC);//Lê o Valor de ADC

//TimerMatchSet(TIMER0_BASE, TIMER_A,(Valor_ADC)); //Altera o Valor do dutycycle

void config_Timer_Amostra(void){

SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER2);

TimerConfigure(TIMER2_BASE,TIMER_CFG_PERIODIC);

TimerLoadSet(TIMER2_BASE,TIMER_A,3999);//10kHz

TimerEnable(TIMER2_BASE, TIMER_A);

TimerIntEnable(TIMER2_BASE,TIMER_TIMA_TIMEOUT);

IntEnable(INT_TIMER2A);

}
void Trapezio(void){

TimerIntClear(TIMER2_BASE,TIMER_TIMA_TIMEOUT);

TimerMatchSet(TIMER0_BASE, TIMER_A,dutyCycle);

if (i>=1 && i<50){

dutyCycle=(2.0/3)*PERIODO;}

else if (i>=50 && i<60){

dutyCycle= (2.0/3)*PERIODO+t*rampa;

t=t+1;}

else if(i>=60 && i<150){

t=1;

dutyCycle=PERIODO;}

else if(i>=150 && i<160){

dutyCycle=PERIODO - rampa*g;

g=g+1;}

else if(i>=160 && i<250){

dutyCycle=(2.0/3)*PERIODO;

g=1;}

else if(i>=250 && i<260){

dutyCycle=(2.0/3)*PERIODO - rampa*c;

c=c+1;}

else if(i>=260 && i<350){

dutyCycle=1.0/3*PERIODO;

c=1;}

else if(i>=350 && i<360){

dutyCycle= (1.0/3)*PERIODO+ rampa*d;


d=d+1;}

else if (i>=360 && i<=400){

dutyCycle=2.0/3*PERIODO;

d=0;

/*i++;

if(i==401)i=1;x=2;*/

if(x==1){

DUTYCycleRef[i-1]=dutyCycle;}

i++;

if(i==401){

i=1;

Ui[i-1]=Ui[399];

Erro[i-1]=Erro[399];

x=2;}

if(x==2){

rampa = (PERIODO)/30;//133;

double Kp=0.38,Ki=0.129191649861,Kd=3.1;
Erro[i] =(DUTYCycleRef[i]-*Valor_ADC);

Up[i] = Kp*Erro[i];

Ui[i] = Ki*Erro[i] + Ui[i-1];

Ud[i] = Kd*(Erro[i]-Erro[i-1]);

Upid[i] = Ui[i]+ Up[i] + Ud[i];// + DUTYCycleRef[i];

PERIODO=Upid[i];

if(PERIODO>=3998){

PERIODO=3998;

You might also like