高级会员
- 积分
- 534
- 威望
- 270
- 贡献
- 164
- 兑换币
- 160
- 注册时间
- 2016-3-28
- 在线时间
- 50 小时
- 毕业学校
- 安徽
|
#include <hidef.h>
#include "derivative.h"
#define BUS_CLOCK 32000000 //总线频率
#define OSC_CLOCK 16000000 //晶振频率
unsigned int duoji=6000;
unsigned int AD_data0[10];
unsigned int AD_data1[10];
unsigned int AD_temp;
unsigned int AD_average0=0;
unsigned int AD_average1=0;
/*************************************************************/
/* 初始化锁相环 */
/*************************************************************/
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
}
/************************************************************/
/* 初始化ECT模块 */
/************************************************************/
void initialize_ect(void){
TSCR1_TFFCA = 1; // 定时器标志位快速清除
TSCR1_TEN = 1; // 定时器使能位. 1=允许定时器正常工作; 0=使主定时器不起作用(包括计数器)
TIOS = 0xff; //指定所有通道为输出比较方式
TCTL1 = 0x00; // 后四个通道设置为定时器与输出引脚断开
TCTL2 = 0x00; // 前四个通道设置为定时器与输出引脚断开
TIE = 0x00; // 允许通道4定时中断
TSCR2 = 0x07; // 预分频系数pr2-pr0:111,,时钟周期为4us,
TFLG1 = 0xff; // 清除各IC/OC中断标志位
TFLG2 = 0xff; // 清除自由定时器中断标志位
}
/*************************************************************/
/* 延时函数 */
/*************************************************************/
void delay1ms(unsigned int n)
{
unsigned int i;
for(i=0;i<n;i++)
{
TFLG1_C0F = 1; //清除标志位
TC0 = TCNT + 250; //设置输出比较时间为1ms
while(TFLG1_C0F == 0); //等待,直到发生输出比较事件
}
}
/*************************************************************/
/* 初始化PWM */
/*************************************************************/
void init_pwm(void)
{
PWMCTL_CON45= 1; //通道45为16位的PWM
PWMPOL_PPOL5= 1; //通道的极性为高电平有效
PWMPRCLK = 0x22; //A时钟和B时钟的分频系数为4,频率为8MHz
PWMSCLA = 1; //SA时钟频率为4MHz
PWMSCLB = 1; //SB时钟频率为4MHz
PWMCLK = 0x20; //45用SA时钟作为时钟源
PWMCAE = 0x00; //脉冲模式为左对齐模式
PWMPER45 = 40000; //周期10ms
PWMDTY45 = duoji;
PWME_PWME5=1;
}
//ad 初始化
void ATD0_init(void)
{
ATD0DIEN=0x00; //禁止数字输入
ATD0CTL1=0x20; //0010 0000选择8位转换精度
ATD0CTL2=0x40; //0100 0000打开CCF快速清零位,关闭外部触发输入,关闭中断
ATD0CTL3=0xa0; //1010 0000数据右对齐,no fifo,转换序列长度为4
ATD0CTL4=0x0b; //0000 1010采样时间为4个ATD时钟周期, ATDCLK=24MHZ/(2*(11+1))=2MHZ
ATD0CTL5=0x30; //0011 0000从通道零开始多通道连续采样,同时启动AD转换序列
}
// 读取ad值
unsigned int Read_AD(int ch)
{
unsigned int ad;
DisableInterrupts;
while(!ATD0STAT0_SCF);
switch (ch)
{
default:
case 0: ad=ATD0DR0;
break;
case 1: ad=ATD0DR1;
break;
}
EnableInterrupts;
return ad;
}
/****************AD获得数据********************/
void Get_AD_data(void)
{
int i=0,j=0,q=0;
for(j=0;j<10;j++)
{
AD_data0[j]=Read_AD(0);
AD_data1[j]=Read_AD(1);
}
/****************数据更新*************************/
for(j=0;j<9;j++)
{
AD_data0[j]=AD_data0[j+1];
AD_data1[j]=AD_data1[j+1];
}
AD_data0[9]=Read_AD(0);
AD_data1[9]=Read_AD(1);
/**************从小到大排序,冒泡法**********************/
for(i=0;i<9;i++)
for(j=0;j<9-i;j++)
{
if(AD_data0[j]>AD_data0[j+1])
{
AD_temp=AD_data0[j];AD_data0[j]=AD_data0[j+1];AD_data0[j+1]=AD_temp;
}
if(AD_data1[j]>AD_data1[j+1])
{
AD_temp=AD_data1[j];AD_data1[j]=AD_data1[j+1];AD_data1[j+1]=AD_temp;
}
}
/*****************去掉最大值最小值,求平均值**************/
AD_average0=(AD_data0[1]+AD_data0[2]+AD_data0[3]+AD_data0[4]+AD_data0[5]+AD_data0[6]+AD_data0[7]+AD_data0[8])/8;
AD_average1=(AD_data1[1]+AD_data1[2]+AD_data1[3]+AD_data1[4]+AD_data1[5]+AD_data1[6]+AD_data1[7]+AD_data1[8])/8;
}
/*******************舵机控制***********************/
/* void steer_control()
{
for(;;)
{
delay1ms(500);
PWMDTY45= duoji;
if(AD_average0<AD_average1)
{
delay1ms(1000);
PORTB_PB0=1;
PWMDTY45= 2000;
}
else if(AD_average0>AD_average1)
{
delay1ms(1000);
PORTB_PB1=1;
PWMDTY45= 10000;
}
else
{
delay1ms(1000);
PORTB_PB2=1;
}
}
} */
void main(void)
{
DisableInterrupts;
INIT_PLL();
ATD0_init() ;
initialize_ect();
init_pwm();
EnableInterrupts;
DDRB=0XFF;
for(;;)
{
Get_AD_data();
// delay1ms(500);
PWMDTY45= duoji;
if(AD_average0<AD_average1)
{
delay1ms(1000);
PORTB_PB0=1;
PWMDTY45= 2000;
}
else if(AD_average0>AD_average1)
{
delay1ms(1000);
PORTB_PB1=1;
PWMDTY45= 10000;
}
else
{
delay1ms(1000);
PORTB_PB2=1;
}
}
}
|
|