⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dollycon1.c

📁 基于s3c44b0x的小车控制程序
💻 C
字号:
#include <string.h>
#include "..\inc\option.h"
#include "..\inc\44b.h"
#include "..\inc\44blib.h"
#include "..\inc\def.h"

void Isr_Init(void);
void HaltUndef(void);
void HaltSwi(void);
void HaltPabort(void);      
void HaltDabort(void);

void setpwm(int ratio0); //调节定时器输出PWM波的占空比,设定驱动轮速度
void speedup(void);      //加速
void speeddown(void);    //减速
void init_Ext4567(void);
void __irq Eint4567Isr(void); //__attribute__ ((interrupt("IRQ")));

//****************************************************************
// *		  S3C44B0X developer's notes			*  
// ****************************************************************

extern int Speed=50;//ratio0为驱动轮电机,ratio1为捡球电机

void Main(void)
{
    int freq1=200,ratio1=50;           //定时器0用于输出控制驱动轮的PWM波,定时器1用于输出控制捡球电机的PWM波 
    
    rSYSCFG=SYSCFG_8KB;
#if (PLLON==1)
    ChangePllValue(PLL_M,PLL_P,PLL_S);
#endif

    Isr_Init();
    Port_Init();
    Uart_Init(0,115200);
    init_Ext4567();
    
    Uart_Select(0);
    Delay(0);  //calibrate Delay()
    Delay(5000);
    
    
    
    Uart_Printf("\n\n\n             欢迎使用Daniel SW3C44B0 测试程序V1.0 (2004-10-21 )\n\n");
  	Uart_Printf("\nS3C44B0X Test Program Ver 0.00 rSYSCFG=0x%x MCLK=%d\n\n",rSYSCFG,MCLK);
	
    rPDATE = 0x157;				//Beep = 10
    //rPCONE = 0x596b;      // tout2		
    rPCONE =0x15aab;		//01 0101 1010 1010 1011 :6.7.8位为输出,3 4 5位为定时器输出
    rPUPE  = 0xff;          //上拉电阻不允许接到对应位
    
    
    
    rTCON  	&= 0xfffff0ff;					//定时器1输出捡球电机PWM波
	rTCFG0 	&= 0xffffff0f;					
	rTCFG1 	&= 0xffffff0f;					// set Timer 0 1 MUX 1/16
	rTCFG1  |= 0x0000003f;	
	rTCNTB2	 = MCLK/(freq1*16);				//if set inverter off, when TCNT2<=TCMP2, TOUT is high, TCNT2>TCMP2, TOUT is low
	rTCMPB2  = (rTCNTB2*(100-ratio1))/100;	//if set inverter on,  when TCNT2<=TCMP2, TOUT is low,  TCNT2>TCMP2, TOUT is high
	rTCON	|= 0x00000200;					// manual update
	rTCON	&= 0xfffff0ff;	  				// clear manal update bit
	rTCON   |= 0x00000d00;					// auto reload, inverter on, start Timer 1
    
    rADCPSR=128;         //ADC预置比例因子寄存器
	
	while(1)
    {
      int dir,i;
      //dir=rPDATF&0x1E3;  // f口的0,1,5,6,7,8位作为按键扫描口
      
      dir=(rPDATF&0x1E0)>>5;   //g口的高四位作为按键扫描口,采用开发板上的按键
      //Uart_Printf("while");
      Uart_Printf("%d \n",dir);     
      switch(dir)
      {
       case 0xE:  
         rPDATE=(rPDATE&0x13f)|0x80;   
            setpwm(Speed);   Delay(200);   break;//前进
       case 0xD: 
         rPDATE=(rPDATE&0x13f)|0x40;  
            setpwm(Speed);   Delay(200);    break;//后退
       case 0xB: 
         rPDATE=(rPDATE&0x13f)|0xc0;  
            setpwm(20);     Delay(200);   break;//左转  
       case 0x7: 
         rPDATE=(rPDATE&0x13f)|0x00;   
            setpwm(20);     Delay(200);  break;//右转
       case 0xF: 
         rPDATE=(rPDATE&0x13f)|0x00;                       
            setpwm(0);      Delay(200);   break;//停止,应该设置占空比为0; rTCON &= ~0x1100;
               
      }
      
      rADCCON=0x1|(0x0<<2);
  	  while(rADCCON&0x1);
  	
  	  while(!(rADCCON&0x40));
      for(i=0;i<rADCPSR;i++);
      //Uart_Printf("A0=%d\n",rADCDAT);
      if(rADCDAT>615) //pe8反号。大于指定值,捡球电机反向,否则,正常转动方向
      rPDATE|=0x100;
      else
      rPDATE&=0x0ff;
    }

}

void setpwm(int ratio0)
{
    
    int Ratio0=ratio0,Freq=500;             //定时器0输出驱动轮PWM波
    //Uart_Printf("in ");
    
    rTCON  	&= 0xfffffff0;					// 清除手动更新位,关Timer0
	rTCFG0 	&= 0xfffffff0;					// 设置定时器0和1的预分频值为0
	rTCFG1 	&= 0xfffffff0;					// 是指定时器MUX0和MUX1输入为1/16
	rTCFG1  |= 0x00000003;	
	rTCNTB0	 = MCLK/(Freq*16);				//if set inverter off, when TCNT2<=TCMP2, TOUT is high, TCNT2>TCMP2, TOUT is low
	rTCMPB0  = (rTCNTB0*(100-Ratio0))/100;	//if set inverter on,  when TCNT2<=TCMP2, TOUT is low,  TCNT2>TCMP2, TOUT is high
	rTCON	|= 0x00000002;					// 手动更新
	rTCON	&= 0xfffffff0;	  				// 清除手动更新位
	rTCON   |= 0x0000000d;					// 自动装载,反向器开,打开定时器0
	
}
void speedup(void)
{
    if(Speed+10<90)
    {
       Speed=Speed+10;
       Uart_Printf("%d \n",Speed);
       //setpwm(Speed);
    }
    else
    Uart_Printf("upper limit!\n");
}
void speeddown(void)
{
    if(Speed-10>20)
    {
       Speed=Speed-10;
       Uart_Printf("%d \n",Speed);
       //setpwm(Speed);
    }
    else
    Uart_Printf("lower limit!\n");

}

void init_Ext4567(void)
{
	rINTCON=0x5;
	rINTMOD=0x0;
		
	rINTMSK=~(BIT_GLOBAL|BIT_EINT4567);
    pISR_EINT4567=(int)Eint4567Isr;
    rPCONG=0xffff;			
	rPUPG=0x0;				   // 上拉电阻使能
	rEXTINT=rEXTINT|0x22220000;  // EINT4567 下降沿模式
	
	rI_ISPC=BIT_EINT4567;        // 清除挂起位
	rEXTINPND=0xf;			   // 清除EXTINTPND寄存器
}

void __irq Eint4567Isr(void)
{
       
    unsigned char i,key5=0,key6=0;
    
    //采样六次
    for(i=0;i<6;i++)
    {
      if(rEXTINPND==1)        { Delay(250); key5++;}
      else if (rEXTINPND==2)  { Delay(250); key6++;}
      
      else                    { break;}
    }
    
    if     (key5==6) speedup();
    else if(key6==6) speeddown();
               
    rEXTINPND=0xf;				//清除EXTINTPND寄存器   
    rI_ISPC|=BIT_EINT4567;		//清除挂起位
   
}

void Isr_Init(void)
{
    U32 i;
    
    pISR_UNDEF=(unsigned)HaltUndef;
    pISR_SWI  =(unsigned)HaltSwi;
    pISR_PABORT=(unsigned)HaltPabort;
    pISR_DABORT=(unsigned)HaltDabort;
    
     for(i=_RAM_STARTADDRESS;i<(_RAM_STARTADDRESS+0x20);i+=4)
    {
	*((volatile unsigned *)i)=0xEA000000+0x1FFE;
    }

    //rINTCON=0x1;	  // Vectored Int. IRQ enable,FIQ disable    
    rINTCON=0x5;	  // Non-vectored,IRQ enable,FIQ disable    

    rINTMOD=0x0;	  // All=IRQ mode
    rINTMSK|=BIT_GLOBAL|BIT_EINT4567;	  // All interrupt is masked.
        	
	
}


void HaltUndef(void)
{
    Uart_Printf("Undefined instruction exception!!!\n");
    while(1);
}

void HaltSwi(void)
{
    Uart_Printf("SWI exception!!!\n");
    while(1);
}

void HaltPabort(void)
{
    Uart_Printf("Pabort exception!!!\n");
    while(1);
}

void HaltDabort(void)
{
    Uart_Printf("Dabort exception!!!\n");
    while(1);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -