智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 3057|回复: 3
打印 上一主题 下一主题

紧急求救!简单实用的12个激光管加电调程序!

[复制链接]

0

主题

2

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
224
威望
188
贡献
32
兑换币
10
注册时间
2009-2-21
在线时间
2 小时
跳转到指定楼层
1#
发表于 2009-5-24 15:43:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
5贡献
简单实用的12个激光管加电调的程序!经过测试,哪位高手能给分析一下啊!
#include <hidef.h>      /* common defines and macros */
#include <MC9S12XS128.h>     /* derivative information */
#pragma LINK_INFO DERIVATIVE "mc9s12xs128"
unsigned int sensor;
unsigned int speed;
char error;
char lasterror;
unsigned char cflag;
unsigned char sflag;


void SetBusCLK_80M(void)
{   
    CLKSEL=0X00;    //disengage PLL to system
    PLLCTL_PLLON=1;   //turn on PLL
    SYNR =0xc0 | 0x09;                        
    REFDV=0xc0 | 0x01;
    POSTDIV=0x00;       //pllclock=2*osc*(1+SYNR)/(1+REFDV)=160MHz;
    _asm(nop);          //BUS CLOCK=80M
    _asm(nop);
    while(!(CRGFLG_LOCK==1));   //when pll is steady ,then use it;
    CLKSEL_PLLSEL =1;          //engage PLL to system;
}



static void IOC_Init(void)
{   
    TSCR1=0x80;//定时器使能
    TSCR2=0X01;
    PACTL=0X50;//PT7 PIN,PACN32 16BIT,FALLing edge,NOT INTERRUPT
    TCTL3=0xc0;//c-输入捕捉7任何沿有效,            
    TCTL4=0x0a;//40表示ICx禁止, 1表示上升沿, 2表示下降沿, 3表示任何沿      
    TIE=0x02;//每一位对应相应通道中断允许,0表示禁止中断
    TIOS =0x00;//每一位对应通道的: 0输入捕捉,1输出比较
    TCTL3_EDG7x=1;//c-输入捕捉7任何沿有效,
}  


/*******************************************************
函数名称:PwmInit
函数作用:初始化PWM,通道0使用100K时钟A,8位PWM控制电机,通道23级联使用16位PWM,2000K时钟A控制舵机
入口参数:无
出口参数:无
********************************************************/
void PwmInit(void)
{
  PWME=0x00;//关闭PWM
  PWMPOL=0xff;//PWM极性先高后低
  PWMCLK=0xff;   //使用时钟源SA,SB
  PWMPRCLK=0x33;//时钟源A,B为E/8=10MHz
  PWMCAE=0x00;//左对齐
  PWMCTL=0x00;
  PWMCTL_CON01=1;//级联01
  PWMCTL_CON23=1;
  PWMSCLA=0x28;//时钟源SA为20KHz Clock SA = Clock A / (2 * PWMSCLA)
  PWMSCLB=0x28;  //时钟源SB为125KHz  Clock SB = Clock B / (2 * PWMSCLB)
  PWMPER01=1000; //PWM0时钟频率为100HZ   PWMx 周期= 时钟周期 * PWMPERx的值
  //PWMPER1=0x14;//PWM1时钟频率为1KHz   PWMx 周期= 时钟周期 * PWMPERx的值
  PWMPER23=2500;
  PWMDTY01=160; //占空比=[(PWMDTYx)/PWMPERx] * 100%
  PWMDTY23=180;
  //PWMDTY1=0x07;
  PWME=0x0f;
}

void RTI_Init(void)
{               
    RTICTL=0x77;   //8x2^16 =>32,75ms,30.5175Hz                     
    //CRGINT=0X80;   //enable RTI Interrupt
    CRGINT=0X80;   //enable RTI Interrupt
}





void main(void) {
  /* put your own code here */
  unsigned int direction;        
  //int sp;                    
  SetBusCLK_80M();         
  IOC_Init();                 
  PwmInit();
  DDRA=0X00;            
  PUCR_PUPAE=1;
  DDRB=0X00;
  PUCR_PUPBE=1;
  DDRE=0XFF;
  PORTE=0X0C;
  RTI_Init();
  EnableInterrupts;
  cflag=0;           
  sflag=0;

  for(;;)
  {
    sensor=(unsigned int)PORTB;
    sensor=sensor*16;
    sensor+=(unsigned int)(PORTA&0X0F);
    switch(sensor)
    {
      case  1: error=11;break;
      case 3: error=10;break;
      case 2:error=9;break;
      case 6:error=8;break;
      case 4:error=7;break;
      case 12:error=6;break;
      case 8:error=5;break;
      case 24:error=4;break;
      case 16:error=3;break;
      case 48:error=2;break;
      case 32:error=1;break;
      case 96:error=0;break ;
      case 64:error=-1;break;
      case 192:error=-2;break;
      case 128:error=-3;break;
      case 384:error=-4;break;
      case 256:error=-5;break;
      case 768:error=-6;break;
      case 512:error=-7;break;
      case  1536:error=-8;break;
      case 1024:error=-9;break;
      case  3072:error=-10;break;
      case 2048:error=-11;break;
      default: error=lasterror;break;
    }
    if(error>=6||error<=-6)
    {
      
      cflag=1;
      if(sflag==1||speed>25)
      {
        PWMDTY01=250;
        sflag=0;
      }
      else
      {
        if(speed<20)
        {
          PWMDTY01=163;
        }
      
        
      }
    }
    else
    {
      cflag=0;
      sflag=1 ;
      if(speed>25)
      PWMDTY01=176;
      else PWMDTY01=165 ;
    }
    direction=178+error*4;
    if(direction>=226)
    direction=226;
    if(direction<=134)
    direction=134;
    PWMDTY23=direction;
   
   
    lasterror=error;
  } /* wait forever */
  /* please make sure that you never leave this function */
}





#pragma CODE_SEG __NEAR_SEG NON_BANKED
interrupt void RTI_ISR(void)
{
  CRGFLG_RTIF = 1; //中断标志位清零
  speed=PACNT;//读取测速脉冲值
  PACNT=0;
   
}


#pragma CODE_SEG DEFAULT

0

主题

2

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
224
威望
188
贡献
32
兑换币
10
注册时间
2009-2-21
在线时间
2 小时
2#
 楼主| 发表于 2009-5-24 15:44:33 | 只看该作者
补充说明一下!芯片主板是采用MC9S12XS128MAA
回复

使用道具 举报

22

主题

518

帖子

0

精华

版主

Rank: 9Rank: 9Rank: 9

积分
6442
QQ
威望
943
贡献
5041
兑换币
99
注册时间
2008-2-26
在线时间
229 小时
3#
发表于 2009-5-24 23:26:20 | 只看该作者
分析什么呢
回复

使用道具 举报

1

主题

43

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1798
威望
235
贡献
1549
兑换币
4
注册时间
2008-5-29
在线时间
7 小时
4#
发表于 2009-5-27 09:25:52 | 只看该作者
八个激光管放在PTB口上,四个激光管放在PTA0-PTA3上,用脉冲累加方式测速。这个程序没什么可分析的啊?
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-10 06:36 , Processed in 0.043053 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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