金牌会员
- 积分
- 1077
- 威望
- 501
- 贡献
- 196
- 兑换币
- 44
- 注册时间
- 2012-4-4
- 在线时间
- 190 小时
- 毕业学校
- 唐山师范
|
#include <hidef.h> /* common defines and macros */
#include "derivative.h" /* derivative-specific definitions */
#define BUS_CLOCK 32000000 //总线频率
#define OSC_CLOCK 16000000 //晶振频率
#define BAUD 9600 //串口波特率
unsigned char AD_data0 ;
unsigned char AD_data1 ;
unsigned char AD_data2 ;
unsigned char AD_data3 ;
float k1=2.15;
float k2=2.2;
float k3;
float k4;
int i;
int acc0;
int angle,acc,ty;
int acc1;
int ty0;
int ty1;
int data0;
int data1;
int num0;
int num1;
int hnum0;
int hnum1;
unsigned char jiah ;
unsigned char jial;
unsigned char tuoh ;
unsigned char tuol;
int angle1;
int angle2;
int angle0;
unsigned char speed0 ;
float m1;
float m2;
float m3;
unsigned char AD_data ;
int count;
float g_fGravityAngle ;
float g_fCarAngle, AngleSpeed;
float g_fCarAnglelast ;
//* 初始化锁相环 */
/*************************************************************/
void INIT_PLL(void)
{
CLKSEL &= 0x7f; //set OSCCLK as sysclk
PLLCTL &= 0x8F; //Disable PLL circuit
CRGINT &= 0xDF;
#if(BUS_CLOCK == 40000000)
SYNR = 0x44;
#elif(BUS_CLOCK == 32000000)
SYNR = 0x43;
#elif(BUS_CLOCK == 24000000)
SYNR = 0x42;
#endif
REFDV = 0x81; //PLLCLK=2×OSCCLK×(SYNR+1)/(REFDV+1)=64MHz ,fbus=32M
PLLCTL =PLLCTL|0x70; //Enable PLL circuit
asm NOP;
asm NOP;
while(!(CRGFLG&0x08)); //PLLCLK is Locked already
CLKSEL |= 0x80; //set PLLCLK as sysclk
}
/*************************************************************/
/* 初始化SCI */
/*************************************************************/
void INIT_SCI(void)
{
SCI0BD = BUS_CLOCK/16/BAUD; //设置SCI0波特率为9600
SCI0CR1 = 0x00; //设置SCI0为正常模式,八位数据位,无奇偶校验
SCI0CR2 = 0x08; //允许发送数据,禁止中断功能
}
/*************************************************************/
/* 初始化AD模块 ,AD01陀螺仪转换,AD00重力加速度 */
/*************************************************************/
void INIT_AD(void)
{
ATD0CTL2 = 0xc0; //启动A/D转换,快速清零,禁止中断
ATD0CTL1=0x40; //选用12位模数转换
ATD0CTL3 = 0x94; //每次转换二个通道
ATD0CTL4 = 0x01; //AD模块时钟频率为2MHz
ATD0CTL5=0x30;//
}
// 串口发送函数
/*************************************************************/
void SCI_send(unsigned char AD_capture)
{
while(!SCI0SR1_TDRE); //等待发送数据寄存器(缓冲器)为空
SCI0DRL =AD_capture;
}
//AD采集函数
void AD_captur(void)
{ i=0; hnum0=0;hnum1=0;
for(i=0;i<15;i++) {
while(!ATD0STAT2_CCF0);
num0=ATD0DR0; //读结果
hnum0+=num0;//求和
while (!ATD0STAT2_CCF1);
num1=ATD0DR1; //读结果
hnum1+=num1;
}
data0=hnum0/15; //15次求平均值,加速度
data1=hnum1/15; //陀螺仪
jiah=(char)(data0/256); //加速度高位 (求高地位发送用)
jial=(char)(data0%256); //低位
tuoh=(char)(data1/256); //陀螺仪高位
tuol=(char)(data1%256); //低位
// SCI_send(jiah);
//SCI_send(jial);
//AD_data= 0xAA;
//SCI_send(AD_data);
//AD_data= 0xA5;
//SCI_send(AD_data);
//SCI_send(tuoh);
//SCI_send(tuol);
}
// PIT模块初始化函数
/*************************************************************/
void init_PIT(void)
{
PITCFLMT=0x00; //禁止中断
PITMTLD0=249; //为0通道8位计数器赋值
PITLD0=639; //为0通道16位计数器赋值 //(249+1)*(639+1)=16000000个总线周期=5ms秒
PITMUX_PMUX0=0; //第0通道使用微计数器0
PITCE_PCE0=1; //第0通道计数器工作
PITINTE_PINTE0=1; //0通道定时器定时中断被使能
PITCFLMT=0x80; //使能周期中断定时器
}
void AngleCalculate (void) //角度计算
{
float fDeltaValue;
g_fGravityAngle = (data0- 1408.5) * 0.11668; //180/(2025-670)加速度
m1=g_fGravityAngle;
if(m1<0) {m1=-m1; }
acc=(int)m1;
acc0=acc/256;//重力高位
acc1=acc%256;// 重力低位
AngleSpeed = (data1 - 1189) *0.05219; //5.12/4096/(20.1*0.001)陀螺仪
m2=AngleSpeed;
if(m2<0) {m2=-m2; }
ty=(int)m2;
ty0=ty/256;//陀螺仪高位
ty1=ty%256; // 陀螺仪低位
g_fCarAngle = g_fCarAnglelast ;
fDeltaValue =(g_fGravityAngle-g_fCarAngle)/3;
g_fCarAnglelast+= (AngleSpeed + fDeltaValue)*0.005;
m3=g_fCarAnglelast;
k3=g_fCarAnglelast;
if(m3<0) {m3=-m3; }
angle=(int)m3;
angle1=angle/256; //角度高位
angle2= angle%256;//角度低位
//return(angle);
}
/*************************************************************/
/* 主函数 */
/*************************************************************/
void main(void) {
DisableInterrupts;
INIT_PLL();
INIT_SCI();
INIT_AD();
init_PIT();
EnableInterrupts;
for(;;)
{
}
}
#pragma CODE_SEG __NEAR_SEG NON_BANKED
interrupt VectorNumber_Vpit0 void PIT_ISR(void)
{ PITTF_PTF0=1;
count=count+1;
if(count==1)
{
AD_captur(); //AD采集
}
else if(count==2)
{
AngleCalculate(); //角度计算,串口发送
AD_data=(char)angle1; //发送高位
SCI_send(AD_data);
AD_data=(char)angle2; //低位
SCI_send(AD_data);
AD_data= 0xAA;
SCI_send(AD_data);
AD_data= 0xA5;
SCI_send(AD_data);
AD_data=(char)acc0; //发送高位
SCI_send(AD_data);
AD_data=(char)acc1;
SCI_send(AD_data); //发送低位
AD_data= 0xAA;
SCI_send(AD_data);
AD_data=(char)ty0; //陀螺仪高位
SCI_send(AD_data);
AD_data=(char)ty1; //陀螺仪低位
SCI_send(AD_data);
}
else if(count>=3)
{ count=1;
AD_captur();
}
}
#pragma CODE_SEG DEFAULT
|
|