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

📄 int.c

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

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

/*************************************************************************************
///////////////////////////////舵机控制方法//////////////////////////////////
//舵机控制数据命令包括两个值一个是最终到达的旋转终止角度,另外一个是速度范围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.11US,2.18*11.11=24.24US
//定时器1.0US为计数单位,24.24/1.0=24.24,每20MS一个周期每次改变数字计数器24,
//改变14个周期完成60度.另外还要考虑角度是增加还是减少.计算出来有小数点,以及误差,
//在最末尾的时候补足角度.计算出最终计数器数字,程序在中断里面自动按照计算出来的
//改变步进时间以及步进次数进行逼近,当和运行到计算最终数据时停止,中断里面每个周期
//都将查询角度数据是否被改变
**************************************************************************************/
unsigned int  PWMDataCount(unsigned int PWMData_buff,unsigned int PWMData_angle,unsigned int PWMData_value)
{
	if(PWMData_buff == PWMData_angle)  return  PWMData_buff;		//如果预设置角度与当前角度相同,返回
        else if(PWMData_buff < PWMData_angle)
	{
		if((PWMData_angle - PWMData_buff) <= PWMData_value)	
			PWMData_buff = PWMData_angle;
		else
			PWMData_buff += PWMData_value;
	}
	else
	{
		if((PWMData_buff - PWMData_angle) <=PWMData_value)	
			PWMData_buff = PWMData_angle;
		else
			PWMData_buff -= PWMData_value;
	}
        return  PWMData_buff;
}

/**********************************************************************
 *函数原型:  TACCR0中断子程序                                    	     
 *参数说明:  无                                        
 *返回值:    无                                                               
 *说明:      定时器A中断服务函数  产生PWM1-PWM8,8路舵机控制信号。  
	     4MHZ时钟,4分频,1US计数单位。0.5ms到2.5ms对应
             舵机0度到180度,每度11.1111US                                           
 **********************************************************************/
#pragma vector = TIMERA0_VECTOR
__interrupt void TimerA_CCR0()
{
	unsigned char 	i;
	unsigned int	TH;
	static	unsigned char	TimerA_20msCounter = 0;	 //TimerA_20MS计数器
	static	unsigned char	PWM_CH = 0;		//PWM通道选择计数器 PWM1-PWM8
	switch(PWM_CH)
	{
		case	0:	PWM1_H;
				PWM2_L;
				PWM3_L;
				PWM4_L;
				PWM5_L;
				PWM6_L;
                                PWM7_L;
				PWM8_L;
                                PWMbuff[0]=PWMDataCount(PWMbuff[0],PWMangle[0],PWMvalue[0]);
                                TACCR0=PWMbuff[0]-1;
                                PWM_CH++;
				TimerA_20msCounter ++;		//舵机每20MS一个周期,用这个20MS周期做计数器时间片
				TimerA_20ms_USR1 ++;
                                if(TimerA_20msCounter >= 5)
				{
				   TimerA_20msCounter =0;
				   TimerA_100ms_M1++;
				   TimerA_100ms_M2++;
				   TimerA_100ms_M3++;
				   TimerA_100ms_M4++;
				   if(TimerA_100ms_M1 >= MotoTime[0])		M1_T;
				   if(TimerA_100ms_M2 >= MotoTime[1])		M2_T;
				   if(TimerA_100ms_M3 >= MotoTime[2])		M3_T;
				   if(TimerA_100ms_M4 >= MotoTime[3])		M4_T;
				}
                                break;

		case	1:	PWM1_L;
				PWM2_H;
                                PWMbuff[1]=PWMDataCount(PWMbuff[1],PWMangle[1],PWMvalue[1]);
                                TACCR0=PWMbuff[1]-1;
                                PWM_CH++;
				break;

		case	2:	PWM2_L;
				PWM3_H;
                                PWMbuff[2]=PWMDataCount(PWMbuff[2],PWMangle[2],PWMvalue[2]);
                                TACCR0=PWMbuff[2]-1;
                                PWM_CH++;
				break;

		case	3:	PWM3_L;
				PWM4_H;
                                PWMbuff[3]=PWMDataCount(PWMbuff[3],PWMangle[3],PWMvalue[3]);
                                TACCR0=PWMbuff[3]-1;
                                PWM_CH++;
				break;

		case	4:	PWM4_L;
				PWM5_H;
                                PWMbuff[4]=PWMDataCount(PWMbuff[4],PWMangle[4],PWMvalue[4]);
                                TACCR0=PWMbuff[4]-1;
                                PWM_CH++;
				break;

		case	5:	PWM5_L;
				PWM6_H;
                                PWMbuff[5]=PWMDataCount(PWMbuff[5],PWMangle[5],PWMvalue[5]);
                                TACCR0=PWMbuff[5]-1;
                                PWM_CH++;
				break;

                case	6:	PWM6_L;
				PWM7_H;
                                PWMbuff[6]=PWMDataCount(PWMbuff[6],PWMangle[6],PWMvalue[6]);
                                TACCR0=PWMbuff[6]-1;
                                PWM_CH++;
				break;

                case	7:	PWM7_L;
				PWM8_H;
                                PWMbuff[7]=PWMDataCount(PWMbuff[7],PWMangle[7],PWMvalue[7]);
                                TACCR0=PWMbuff[7]-1;
                                PWM_CH++;
				break;

		case	8: 	PWM1_L;
				PWM2_L;
				PWM3_L;
				PWM4_L;
				PWM5_L;
				PWM6_L;
                                PWM7_L;
				PWM8_L;
                                TH = 0;
				for(i=0;i<8;i++)	TH += PWMbuff[i];
				TACCR0 = 19999 - TH;	//产生低电平时间 20MS-TH
                                PWM_CH = 0;
				break;

		default :	break;
	}
}

⌨️ 快捷键说明

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