智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 1136|回复: 0
打印 上一主题 下一主题

[采集类] 128 80脚的电轨ad采集控制舵机代码 大神给我看看哪里有问题?

[复制链接]

3

主题

16

帖子

0

精华

高级会员

Rank: 4

积分
534
威望
270
贡献
164
兑换币
160
注册时间
2016-3-28
在线时间
50 小时
毕业学校
安徽
跳转到指定楼层
1#
发表于 2016-5-1 18:45:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#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;
      }
   
  
   }
}



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-12-25 14:31 , Processed in 0.113218 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表