注册会员
- 积分
- 61
- 威望
- 40
- 贡献
- 13
- 兑换币
- 18
- 注册时间
- 2013-7-16
- 在线时间
- 4 小时
- 毕业学校
- 山东科技大学
|
先写上我的程序
#include <hidef.h> /* common defines and macros */
#include "derivative.h" /* derivative-specific definitions */
byte i,j;
/*****************************************
设置总线频率为32Mhz,晶振为16Mhz
*****************************************/
void SetBusClk_32M(void){
CLKSEL_PLLSEL=0;
PLLCTL_PLLON=1;
SYNR=0x41; //0xd8
REFDV=0xc0;//0x07
POSTDIV=0x00;
_asm(nop);
_asm(nop);
while(!(CRGFLG_LOCK==1));
CLKSEL_PLLSEL=1;
}
/*******************************************
pwm初始化
*******************************************/
void PWM_init(void){
PWME=0x00;
PWMCTL=0xf0;//通道01、23、45、67级联
PWMPRCLK=0x11;//总线频率2分频
PWMSCLA=2;//CLKSA=总线频率/PWMPRCLK/(2*PWMSCLA)=4MHZ
PWMSCLB=2;//CLKSB=总线频率/PWMPRCLK/(2*PWMSCLA)=4MHZ
PWMCLK=0xaa;//PWM01选择CLKSA作为时钟、PWM23选择CLKSB作为时钟、PWM45选择CLKSA、PWM67选择CLKSB
PWMPER01=1000;//周期为1000
PWMPER23=1000;//周期为1000
PWMPER45=1000;//周期为1000
PWMPER67=1000;//周期为1000
PWMDTY01=0;
PWMDTY23=0;
PWMDTY45=0;
PWMDTY67=0;
PWMPOL=0xaa;
PWMCAE=0x00;
PWME=0xaa;
}
/****************************************
PT1输入捕捉初始化
******************************************/
void IOC_init(void){
TIOS_IOS1=0;//通道1输入捕捉
TCTL4=0x04;//上升沿捕捉
TSCR2=0x05;
TIE_C1I=1; //允许输入捕捉中断
TSCR1_TEN=1;
}
/*******************************************
IO口初始化
*********************************************/
void IO_Init(void){
DDRP=0xff;
DDRA=0x00;
DDRB=0x00;//00001000
DDRE=0x00;
DDRJ_DDRJ7=0;
DDRM_DDRM0=1;
DDRM_DDRM1=1;
DDRM_DDRM2=1;
DDRM_DDRM3=1;
DDRS_DDRS0=1;
DDRS_DDRS1=1;
DDRS_DDRS2=1;
DDRS_DDRS3=1;
DDRT_DDRT0=0;
PORTB_PB3=1;
}
/************************************************
小车行进函数
************************************************/
void drive(int L,int R) //小车行速,-1000<= L <=1000,-1000<= R <=1000
{
#define L_IN1 PTS_PTS2
#define L_IN2 PTS_PTS0
#define L_IN3 PTS_PTS3
#define L_IN4 PTS_PTS1
#define R_IN1 PTM_PTM2
#define R_IN2 PTM_PTM0
#define R_IN3 PTM_PTM3
#define R_IN4 PTM_PTM1
#define L_EN1 PWMDTY01
#define L_EN2 PWMDTY23
#define R_EN1 PWMDTY67
#define R_EN2 PWMDTY45
if(L>0 && R>0)
{
L_IN1=1; //左右轮均向前转
L_IN2=0;
L_IN3=1;
L_IN4=0;
R_IN1=1;
R_IN2=0;
R_IN3=1;
R_IN4=0;
} else if(L>=0 && R<0)
{
L_IN1=1;
L_IN2=0;
L_IN3=1;
L_IN4=0;
R_IN1=0; //左轮前转,右轮后转
R_IN2=1;
R_IN3=0;
R_IN4=1;
R=-R;
} else if(L<0 && R>=0)
{
L_IN1=0;
L_IN2=1;
L_IN3=0;
L_IN4=1;
R_IN1=1; //左轮后转,右轮前转
R_IN2=0;
R_IN3=1;
R_IN4=0;
L=-L;
}
else if(L==0 && R==0){
L_IN1=0;
L_IN2=0;
L_IN3=0;
L_IN4=0;
R_IN1=0; //快速停车
R_IN2=0;
R_IN3=0;
R_IN4=0;
}
else if(L<0 &&R<0)
{
L_IN1=0;
L_IN2=1;
L_IN3=0;
L_IN4=1;
R_IN1=0; //左轮后转,右轮后转
R_IN2=1;
R_IN3=0;
R_IN4=1;
L=-L;
R=-R;
}
L_EN1=L;
L_EN2=L;
R_EN1=R;
R_EN2=R;
}
/***********************************************
延时函数
***********************************************/
void delay(unsigned int ms){ //1ms
unsigned int i,j;
for(i=0;i<ms;i++)
for(j=0;j<32000;j++);
}
/************************************************
小车避障函数
************************************************/
void bizhang1(void){
#define L0 PORTA_PA0 //左方避障
#define R0 PORTA_PA1
#define B PORTB_PB2
#define F PORTA_PA2
#define L1 PTT_PTT2
#define R1 PTT_PTT1
if(L0==0 && R0==1)//左前L0有障碍
{
drive(0,0);
while(L0==0 && R0==1)
drive(500,-500);
drive(0,0);
}
else if(L0==1 && R0==0)//右前R0有障碍
{
drive(0,0);
while(L0==1 && R0==0)
drive(-500,500);
drive(0,0);
}
else
drive(700,700);
}
void main(void) {
/* put your own code here */
SetBusClk_32M();
PWM_init();
IO_Init();
IOC_init();
EnableInterrupts;
for(;;) {
_FEED_COP(); /*feeds the dog*/
bizhang1();
} /*loop forever
please make sure that you never leave main */
}
#pragma CODE_SEG NON_BANKED
void interrupt 9 IOC1_IRQ(void){
TFLG1_C1F=1;
drive(0,0);
drive(700,-500);
delay(80);
}
#pragma CODE_SEG DEFAULT
PWM信号接在L298N电机驱动的ENA、ENB口,一共用了两块驱动板共驱动四个电机,电机为http://item.taobao.com/item.htm?spm=a1z10.1.w4004-2363248704.14.AapI2g&id=9347686392这个淘宝店的180减速电机,PT1孔用于捕捉传感器的上升沿,开输入捕捉中断;现在程序的问题是当不给电机供电时中断没问题,但是当电机运转时传感器未产生输入捕捉中断芯片就进入中断,而且进中断之后就再也没出来。同样的程序在以前的130减速电机上运行没问题,难道中断还受电机影响?实在无解了,哪位大神帮帮忙啊,万分感激!
|
|