📄 int.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 + -