Professional Documents
Culture Documents
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];
double ulPeriod;
double dutyCycle,rampa;
int i=1,t=1,g=1,c=1,d=1,x=1;
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
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){
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);
dutyCycle=(2.0/3)*PERIODO;}
dutyCycle= (2.0/3)*PERIODO+t*rampa;
t=t+1;}
t=1;
dutyCycle=PERIODO;}
dutyCycle=PERIODO - rampa*g;
g=g+1;}
dutyCycle=(2.0/3)*PERIODO;
g=1;}
dutyCycle=(2.0/3)*PERIODO - rampa*c;
c=c+1;}
dutyCycle=1.0/3*PERIODO;
c=1;}
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];
Ud[i] = Kd*(Erro[i]-Erro[i-1]);
PERIODO=Upid[i];
if(PERIODO>=3998){
PERIODO=3998;