#include "systemInit.h"
#include "uartGetPut.h"
#include "hw_memmap.h"
#include <adc.h>
#include <timer.h>
#include <gpio.h>
#include <uart.h>
#include <hw_types.h>
#include <hw_adc.h>
#include <math.h>
#include <stdio.h>
tBoolean ADC_EndFlag = false; // 定义ADC转换结束的标志
int long suzhu_1[1024]; //外部变量,用于作为过采样数组
int yiwei_1[100];
int long zkb; //外部变量,用于调节占空比
// ****************************************************各功能模块初始化***************************************************
// ADC初始化 (1)
void adcInit(void)
{
SysCtlPeripheralEnable(SYSCTL_PERIPH_ADC); //使能ADC模块
SysCtlADCSpeedSet(SYSCTL_ADCSPEED_500KSPS); // 设置ADC采样速率
ADCSequenceDisable(ADC_BASE, 0); // 配置前先禁止采样序列
ADCSequenceDisable(ADC_BASE, 1);
ADCSequenceDisable(ADC_BASE, 2);
// ADCHardwareOversampleConfigure(ADC_BASE, 4);
//采样序列配置:ADC基址,采样序列编号,触发事件,采样优先级
ADCSequenceConfigure(ADC_BASE, 2, ADC_TRIGGER_PROCESSOR, 0);
ADCSequenceConfigure(ADC_BASE, 1, ADC_TRIGGER_PROCESSOR, 1);
ADCSequenceConfigure(ADC_BASE, 0, ADC_TRIGGER_PROCESSOR, 2);
// 采样步进设置:ADC基址,采样序列编号,步值,通道设置
ADCSequenceStepConfigure(ADC_BASE, 2,0, ADC_CTL_CH0|ADC_CTL_D);
ADCSequenceStepConfigure(ADC_BASE, 2,1, ADC_CTL_CH0|ADC_CTL_D);
ADCSequenceStepConfigure(ADC_BASE, 2,2, ADC_CTL_CH0|ADC_CTL_D);
ADCSequenceStepConfigure(ADC_BASE, 2,3, ADC_CTL_CH0|ADC_CTL_D|ADC_CTL_END);
ADCSequenceStepConfigure(ADC_BASE, 1,0, ADC_CTL_CH0|ADC_CTL_D);
ADCSequenceStepConfigure(ADC_BASE, 1,1, ADC_CTL_CH0|ADC_CTL_D);
ADCSequenceStepConfigure(ADC_BASE, 1,2, ADC_CTL_CH0|ADC_CTL_D);
ADCSequenceStepConfigure(ADC_BASE, 1,3, ADC_CTL_CH0|ADC_CTL_D|ADC_CTL_END);
ADCSequenceStepConfigure(ADC_BASE, 0,0, ADC_CTL_CH0|ADC_CTL_D);
ADCSequenceStepConfigure(ADC_BASE, 0,1, ADC_CTL_CH0|ADC_CTL_D);
ADCSequenceStepConfigure(ADC_BASE, 0,2, ADC_CTL_CH0|ADC_CTL_D);
ADCSequenceStepConfigure(ADC_BASE, 0,3, ADC_CTL_CH0|ADC_CTL_D);
ADCSequenceStepConfigure(ADC_BASE, 0,4, ADC_CTL_CH0|ADC_CTL_D);
ADCSequenceStepConfigure(ADC_BASE, 0,5, ADC_CTL_CH0|ADC_CTL_D);
ADCSequenceStepConfigure(ADC_BASE, 0,6, ADC_CTL_CH0|ADC_CTL_D);
ADCSequenceStepConfigure(ADC_BASE, 0,7, ADC_CTL_CH0|ADC_CTL_D|ADC_CTL_END|ADC_CTL_IE);
ADCIntEnable(ADC_BASE, 0); // 使能ADC中断
IntEnable(INT_ADC0); // 使能ADC采样序列中断
IntMasterEnable(); // 使能处理器中断
ADCSequenceEnable(ADC_BASE, 2);
ADCSequenceEnable(ADC_BASE, 1);
ADCSequenceEnable(ADC_BASE, 0); // 使能采样序列
}
// GPIO初始化 (2)
void gpioInit()
{
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);
GPIOPinTypeGPIOOutput(GPIO_PORTB_BASE,GPIO_PIN_2);
GPIOPinWrite(GPIO_PORTB_BASE,GPIO_PIN_2,0xFF);
}
// timer0初始化 (3)
void timer_0Init()
{
SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0);
TimerConfigure(TIMER0_BASE,TIMER_CFG_32_BIT_PER);
TimerLoadSet(TIMER0_BASE,TIMER_A,40000000); //系统时钟为20MHZ
TimerIntEnable(TIMER0_BASE,TIMER_TIMA_TIMEOUT);
IntEnable(INT_TIMER0A);
IntMasterEnable();
TimerEnable(TIMER0_BASE,TIMER_A);
}
//定时器2初始化,用于测试某段程序的执行时间
void timer_2Init()
{
SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER2);
TimerConfigure(TIMER2_BASE,TIMER_CFG_32_BIT_PER);
TimerLoadSet(TIMER2_BASE,TIMER_A,20000000);
TimerDisable(TIMER2_BASE,TIMER_A);
}
//******************************************各部分初始化结束***************************************
//******************************************各种声明********************************************
// 结构体声明 (1)
typedef struct PID
{
float SetPoint; //目标值
float Proportion; //比例系数
float Integral; //积分系数
float Derivative; //微分系数
float PrevError; //
float LastError; //上次的偏差
float SumError; //总偏差
float LastUd;
float a;
int Li; //控制积分器的开/关
}PID;
//*****************************************所有声明结束*********************************************************************
PID stPID; //定义一个stPID变量
//*****************************************各种方法的定义******************************************************************
//PID运算代码 方法(1)
float PIDCalc(PID*pp, int long NextPoint)
{
stPID.SetPoint=100; //目标值
stPID.Proportion=80; //比例系数(10,40,70,60,80)
stPID.Integral=1.2; //积分系数
stPID.Derivative=100; //微分系数
stPID.a=0.5; //不完全微分中的系数
float Error,PID;
// float dError;
Error=(pp->SetPoint)-(NextPoint); //最新偏差 kp*e(k)
// dError=(Error)-(pp->LastError); //微分 kd*[e(k)-e(k-1)]
pp->SumError+=Error; //积分 ki*[e(0)+(1)+(2)+(3)+.....]
if(fabs(Error)>10) //积分分离的条件判断
{
(pp->Li)=0; //如果误差大于,等于100,则关闭积分器
}
else
{
(pp->Li)=1; //如果小于100,则打开积分器,以消除静差
}
PID=((pp->Proportion)*Error //比例项
+((pp->Derivative)*(1-(pp->a))*Error+(pp->a)*(pp->LastUd)-(pp->Derivative)*(1-(pp->a))*(pp->LastError)) //不完全微分项 运用了不完全微分
//+(pp->Derivative)*dError //一般的微分项
+(pp->SumError)*(pp->Integral)*(pp->Li)); //积分项 Li 用于控制积分作用的开或关
//(pp->PrevError)=(pp->LastError); //数据保存
(pp->LastError)=Error;
(pp->LastUd)=((pp->Derivative)*(1-(pp->a))*Error+(pp->a)*(pp->LastUd)-(pp->Derivative)*(1-(pp->a))*(pp->LastError)); //保存上次的微分值
return(PID);
}
// ADC采样 方法(2)
unsigned long adcSample(void)
{
int i,n,m1,t1,p1;
int long sum_1=0,sum_2=0,sum_3=0,sum=0;
int long cysz_1[8];
int long cysz_2[4];
int long cysz_3[4];
ADCProcessorTrigger(ADC_BASE, 2);
ADCProcessorTrigger(ADC_BASE, 1);
ADCProcessorTrigger(ADC_BASE, 0); // 处理器触发采样序列
while (!ADC_EndFlag); // 等待采样结束
ADC_EndFlag = false; // 清除ADC采样结束标志
for(i=0;i<8;i++) //读取序列0的8个值
{
cysz_1[i]=(HWREG(ADC_BASE + ADC_O_SSFIFO0)-0x1FF);
}
for(n=0;n<4;n++) //读取序列 1,2的4个值
{
cysz_2[n]=(HWREG(ADC_BASE + ADC_O_SSFIFO1)-0x1FF);
cysz_3[n]=(HWREG(ADC_BASE + ADC_O_SSFIFO2)-0x1FF);
}
//符号处理
/*
for(m=0;m<8;m++)
{
if(cysz_1[m]>511) //如果第十位为1,则将次1移至最前面
{
cysz_1[m]=cysz_1[m]|(-3225
评论1