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