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

📄 system.c

📁 走迷宫的智能小车
💻 C
字号:
#include "msp430x14x.h"
#include  "public.h"

extern	unsigned char	TimerA_20ms_USR1;		//20MS数器1
extern	unsigned char	TimerA_100ms_M1;		//100MS计数器用于对电机1转动时间计数
extern	unsigned char	TimerA_100ms_M2;		//100MS计数器用于对电机2转动时间计数
extern	unsigned char	TimerA_100ms_M3;		//100MS计数器用于对电机3转动时间计数
extern	unsigned char	TimerA_100ms_M4;		//100MS计数器用于对电机4转动时间计数


unsigned char	PWM_angle[8] = {90,90,90,90,90,90,90,90};	//初始化旋转角度在90度
unsigned char	PWM_speed[8] = {255,255,255,255,255,255,255,255};//初始化速度在最大
unsigned char	MotoTime[4] = {0x00,0x00,0x00,0x00};	//减速电机时间参数;

///////////////////////////////舵机控制方法//////////////////////////////////
//舵机控制数据命令包括两个值一个是最终到达的旋转终止角度,另外一个是速度范围0-255,
//255代表最大速度,MG995舵机速度是0.2秒60度,0代表最小速度设定为2.55秒每60度
//255减去速度参数 . 比如转动30度,速度参数200,255-200=55,代表550MS完成60度角度
//550MS/60=9.16MS运行一度,30度,时间30*9.16=275,舵机20MS一个周期,275/20=13.75个周期
//完成动作.一共要转动30度,每周期转动:30/13.75=2.18,每度11.1111US,2.18*11.1111=24.24US
//定时器1.0US为计数单位,24.24/1.0=24.24,每20MS一个周期每次改变数字计数器24,
//改变14个周期完成60度.另外还要考虑角度是增加还是减少.计算出来有小数点,以及误差,
//在最末尾的时候补足角度.计算出最终计数器数字,程序在中断里面自动按照计算出来的
//改变步进时间以及步进次数进行逼近,当和运行到计算最终数据时停止,中断里面每个周期
//都将查询角度数据是否被改变
/////////////////////////////////////////////////////////////////////////////
void Sys_PWMDataAccount(void)	//根据舵机旋转角度PWMangle和舵机速度PWMspeed这两个量计算舵机控制量
{
	unsigned char  i;
	for(i=0;i<8;i++)
	{
		PWMangle[i] = 500 + (unsigned int)(((unsigned long)PWM_angle[i]*111111)/10000);	//最终角度数据
		if(PWMangle[i] == PWMbuff[i])		continue;	//如果到达角度和当前角度相同,不修改寄存器
		PWMvalue[i] = (unsigned int)(1333/(0x0ff-PWM_speed[i]));  //((60*20)/(10*(255-x)))*(11.1111/1.0)
	}

}               //需要改动的是10000和1333这两个值

///////////////////////////////控制板功能函数///////////////////////////////////////////////////////////////////////////

/********************************************************************************
 *函数原型:  void rc_moto_control(unsigned char *point)                                       	     
 *参数说明:  *point  指向24字节舵机控制数据,控制数据定义见控制板舵机控制命令说明                                        
 *返回值:    无                                                               
 *说明:      设定12路舵机角度控制	                                           
 ********************************************************************************/
void rc_moto_control(unsigned char *point)
{
	unsigned char	i;
	for(i=0;i<8;i++)	
	{
		if(*(point+(i*2)) <= 180)	PWM_angle[i] = *(point+(i*2)); //控制字必须小于180度,大于180度控制字丢弃
		PWM_speed[i] = *(point+(i*2+1));	//舵机速度控制字
	}
	Sys_PWMDataAccount();//根据舵机旋转角度PWMangle和舵机速度PWMspeed这两个量计算舵机控制量
        TACCTL0 |= CCIE;
}

/********************************************************************************
 *函数原型:  void dc_moto_control(unsigned char *point)                                       	     
 *参数说明:  *point  指向8字节直流电机控制数据,控制数据定义见控制板电机控制命令说明                                        
 *返回值:    无                                                               
 *说明:      设定4路直流电机控制	                                           
 ********************************************************************************/
void dc_moto_control(unsigned char *point)
{	
        TACCTL0 |= CCIE;							
	TimerA_100ms_M1 = 0;		//设定各个电机的运行时间0.1MS-25.5S
	TimerA_100ms_M2 = 0;
	TimerA_100ms_M3 = 0;
	TimerA_100ms_M4 = 0;
	MotoTime[0] = *(point+1);
	MotoTime[1] = *(point+3);
	MotoTime[2] = *(point+5);
	MotoTime[3] = *(point+7);
	if(0x80 == *point)	M1_T;	//MOTO1停止
	else if(*point < 0x80)
	{
		M1_L;
	}
	else
	{
		M1_R;
	}
	if(0x80 == *(point+2))	M2_T;	//MOTO2停止
	else if(*(point+2) < 0x80)
	{
		M2_L;
	}
	else
	{
		M2_R;
	}
	if(0x80 == *(point+4))	M3_T;	//MOTO3停止
	else if(*(point+4) < 0x80)
	{
		M3_L;
	}
	else
	{
		M3_R;
	}
	if(0x80 == *(point+6))	M4_T;	//MOTO4停止
	else if(*(point+6) < 0x80)
	{
		M4_L;
	}
	else
	{
		M4_R;
	}				
}

/********************************************************************************
 *函数原型:  void IO_mode_set(unsigned char temp8)	                                       	     
 *参数说明:  temp8  8位IO设置字                                        
 *返回值:    无                                                               
 *说明:      设置8位IO模式	                                           
 ********************************************************************************/
void IO_mode_set(unsigned char temp8)	//设置8位IO模式
{
  P1DIR = temp8;			//P1口 TTL模式设置
}

/********************************************************************************
 *函数原型:  void write_IO(temp8)		                                      	     
 *参数说明:  temp8  8位IO值                                        
 *返回值:    无                                                               
 *说明:      写8位IO值	 	                                           
 ********************************************************************************/
void write_IO(unsigned char temp8)		//写8位IO值
{
	EXT_IO_OUT = temp8;			//P1口 TTL输出
}

/********************************************************************************
 *函数原型:  unsigned char  read_IO(void)		                                      	     
 *参数说明:  temp8  8位IO值                                        
 *返回值:    无                                                               
 *说明:      读取8位IO输入	 	                                           
 ********************************************************************************/	
unsigned char read_IO(void)
{
	unsigned char temp8;
	temp8 = EXT_IO_IN;
	return temp8;
}

/********************************************************************************
 *函数原型:  void 	delay(uint8 time)	                                      	     
 *参数说明:  time  延时,分辩率20MS                                       
 *返回值:    无                                                               
 *说明:      延时操作,分辩率20MS	 	                                           
 ********************************************************************************/
void 	delay(unsigned char time)
{
	TimerA_20ms_USR1 = 0;	//延时操作,以20MS为单位
	while(TimerA_20ms_USR1 < time);
        TACCTL0 &= ~CCIE;
}



⌨️ 快捷键说明

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