设计思路是想利用单片机采集电位器上的变化,然后把采集到的信号通过转换输送给舵机,让舵机转换相同的角度。
进程:目前还有一些细节还需要讨论,舵机型号还未选定,不过会尽快定下来。
23组【张**** 韩庆祥 】基于单片机的电位器线控机械手臂
现在手臂已经搭建完成,采用4个盛辉MG995舵机实现机械手臂的8自由度移动;还有一个机械爪重量较重,由于舵机的扭力不够,不能控制机械手臂保持原来的姿势,所以不准备装上了,这是舵机选择的失误。
控制采用的STC83C51单片机,由系统板和键盘构成,系统板和键盘都是自己手工焊的,舵机输出口定在P1口,键盘定在P0口,一共八个键盘实现4个舵机的左右旋转。
程序写的用两个定时器定时输出pwm波,通过检测键盘的高低点位来输出不同的pwm波程序如下:
#include<reg52.h>
typedef unsigned int uint;
typedef unsigned char uchar;
sbit pwm1=P1^0;//输出PWM信号
sbit pwm2=P1^1;//输出PWM信号
sbit pwm3=P1^2;
sbit pwm4=P1^3;
sbit key1 = P0^0;
sbit key2 = P0^1;
sbit key3 = P0^2;
sbit key4 = P0^3;
sbit key5 = P0^4;
sbit key6 = P0^5;
sbit key7 = P0^6;
sbit key8 = P0^7;
uint pwm_value=1500;//初值为1.5ms
uint key=0xff;//初始化键盘
uint value[]={1500,1000,2000};
void delay_ms(uint x)
{
uint i;
while(x--)for(i=0;i<125;i++);
}
void InitTimer(void)
{
TMOD=0x11;//开定时器0,1
TH0=-20000/256;//定时20MS,20MS为一个周期
TL0=-20000%256;
TH1=-1500/256;//定时1.5MS,这时舵机处于0度
TL1=-1500%256;
EA=1;//开总断
TR0=1;//开定时器0
ET0=1;
TR1=1;//开定时器1
ET1=1;
}
void timer0(void) interrupt 1//定时器0中断函数
{
pwm1=1;
pwm2=1;
pwm3=1;
pwm4=1;
TH0=-20000/256;
TL0=-20000%256;
TR1=1;
}
void timer1(void) interrupt 2//定时器1中断函数
{
TH1=-pwm_value/256;
TL1=-pwm_value%256;
TR1=0;
if((key1 ==0)||(key2 == 0))
{
pwm1=0;
pwm2=1;
pwm3=1;
pwm4=1;
}
if((key3 ==0)||(key4 == 0))
{
{ pwm1=1;
pwm2=0;
pwm3=1;
pwm4=1;
}
}
if((key5 ==0)||(key6 == 0))
{
pwm1=1;
pwm2=1;
pwm3=0;
pwm4=1;
}
if((key7 ==0)||(key8 == 0))
{
pwm1=1;
pwm2=1;
pwm3=1;
pwm4=0;
}
}
void timer2(void) interrupt 3//定时器1中断函数
{
TH1=-pwm_value/256;
TL1=-pwm_value%256;
TR1=0;
if((key1 ==0)||(key2 == 0))
{
pwm1=0;
pwm2=1;
pwm3=1;
pwm4=1;
}
if((key3 ==0)||(key4 == 0))
{
pwm1=1;
pwm2=0;
pwm3=1;
pwm4=1;
}
if((key5 ==0)||(key6 == 0))
{
pwm1=1;
pwm2=1;
pwm3=0;
pwm4=1;
}
if((key7 ==0)||(key8 == 0))
{
pwm1=1;
pwm2=1;
pwm3=1;
pwm4=0;
}
}
void main(void)//主函数
{
InitTimer();
pwm_value=1500;
while(1)
{
if(key1==0) //检测按键K1是否按下
{
delay_ms(10); //消除抖动
if(key1==0)
{
pwm_value=value[1];//通过数组就可以改变舵机的转角度
delay_ms(1000);
}
if(key1==0) //检测按键K1是否按下
{
delay_ms(10); //消除抖动
if(key1==0)
{
pwm_value=value[0];//通过数组就可以改变舵机的转角度
delay_ms(1000);
}
}
}
if(key2==0) //检测按键K1是否按下
{
delay_ms(10); //消除抖动
if(key2==0)
{
pwm_value=value[2];//通过数组就可以改变舵机的转角度
delay_ms(1000);
}
if(key2==0) //检测按键K1是否按下
{
delay_ms(10); //消除抖动
if(key2==0)
{
pwm_value=value[0];//通过数组就可以改变舵机的转角度
delay_ms(1000);
}
}
}
/*****************************************************************************/
if(key3==0) //检测按键K1是否按下
{
delay_ms(10); //消除抖动
if(key3==0)
{
pwm_value=value[1];//通过数组就可以改变舵机的转角度
delay_ms(1000);
}
if(key3==0) //检测按键K1是否按下
{
delay_ms(10); //消除抖动
if(key3==0)
{
pwm_value=value[0];//通过数组就可以改变舵机的转角度
delay_ms(1000);
}
}
}
if(key4==0) //检测按键K1是否按下
{
delay_ms(10); //消除抖动
if(key4==0)
{
pwm_value=value[2];//通过数组就可以改变舵机的转角度
delay_ms(1000);
}
if(key4==0) //检测按键K1是否按下
{
delay_ms(10); //消除抖动
if(key4==0)
{
pwm_value=value[0];//通过数组就可以改变舵机的转角度
delay_ms(1000);
}
}
}
/********************************************************************************/
if(key5==0) //检测按键K1是否按下
{
delay_ms(10); //消除抖动
if(key5==0)
{
pwm_value=value[1];//通过数组就可以改变舵机的转角度
delay_ms(1000);
}
if(key5==0) //检测按键K1是否按下
{
delay_ms(10); //消除抖动
if(key5==0)
{
pwm_value=value[0];//通过数组就可以改变舵机的转角度
delay_ms(1000);
}
}
}
if(key6==0) //检测按键K1是否按下
{
delay_ms(10); //消除抖动
if(key6==0)
{
pwm_value=value[2];//通过数组就可以改变舵机的转角度
delay_ms(1000);
}
if(key6==0) //检测按键K1是否按下
{
delay_ms(10); //消除抖动
if(key6==0)
{
pwm_value=value[0];//通过数组就可以改变舵机的转角度
delay_ms(1000);
}
}
}
/*****************************************************************************/
if(key7==0) //检测按键K1是否按下
{
delay_ms(10); //消除抖动
if(key7==0)
{
pwm_value=value[1];//通过数组就可以改变舵机的转角度
delay_ms(1000);
}
if(key7==0) //检测按键K1是否按下
{
delay_ms(10); //消除抖动
if(key7==0)
{
pwm_value=value[0];//通过数组就可以改变舵机的转角度
delay_ms(1000);
}
}
}
if(key8==0) //检测按键K1是否按下
{
delay_ms(10); //消除抖动
if(key8==0)
{
pwm_value=value[2];//通过数组就可以改变舵机的转角度
delay_ms(1000);
}
if(key8==0) //检测按键K1是否按下
{
delay_ms(10); //消除抖动
if(key8==0)
{
pwm_value=value[0];//通过数组就可以改变舵机的转角度
delay_ms(1000);
}
}
}
}
}
// 0是归0,即舵机的中间位置 1是左转45度(正面看)2是右转45度
回复
有奖活动 | |
---|---|
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
【有奖活动】震撼来袭!这场直播将直击工程师的心灵! | |
“我想要一部加热台”活动,不花钱赢取开发好工具!活动开始了哦 | |
【有奖活动】伙伴们:您的“需求”解决了吗? | |
抽奖了,抽奖了,金升阳医疗电源 |
打赏帖 | |
---|---|
【换取手持数字示波器】+与同事对定时器输出相位可调PWM移相全桥控制分享被打赏50分 | |
【换取手持数字示波器】+LP-MSPM0L1306开发板试用体验+串口被打赏40分 | |
CC-RL编译器相关问题求助被打赏10分 | |
【换取手持数字示波器】+与同事对ESP-12开发调试经验分享被打赏50分 | |
【换取手持数字示波器】+同事tek示波器调试spi解析被打赏50分 | |
【换取手持数字示波器】+2.6寸墨水屏调试经验被打赏50分 | |
换取手持数字示波器+个人开关电源的设计经验被打赏50分 | |
【换取手持数字示波器】+【APT32F173测评】+URAT被打赏20分 | |
【换取手持数字示波器】CH32X035的定时器以及外部中断体验被打赏50分 | |
【换取手持数字示波器】CH32X035搭建开发环境(RISC-V)被打赏50分 |