设计思路是想利用单片机采集电位器上的变化,然后把采集到的信号通过转换输送给舵机,让舵机转换相同的角度。
进程:目前还有一些细节还需要讨论,舵机型号还未选定,不过会尽快定下来。
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度

回复
有奖活动 | |
---|---|
【EEPW电子工程师创研计划】技术变现通道已开启~ | |
发原创文章 【每月瓜分千元赏金 凭实力攒钱买好礼~】 | |
【EEPW在线】E起听工程师的声音! | |
“我踩过的那些坑”主题活动——第001期 | |
高校联络员开始招募啦!有惊喜!! | |
【工程师专属福利】每天30秒,积分轻松拿!EEPW宠粉打卡计划启动! | |
送您一块开发板,2025年“我要开发板活动”又开始了! | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
多组DCTODC电源方案被打赏50分 | |
【我踩过的那些坑】STM32cubeMX软件的使用过程中的“坑”被打赏50分 | |
新手必看!C语言精华知识:表驱动法被打赏50分 | |
【我踩过的那些坑】杜绑线问题被打赏50分 | |
【我踩过的那些坑】STM32的硬件通讯调试过程的“坑”被打赏50分 | |
【我踩过的那些坑】晶振使用的问题被打赏100分 | |
【我踩过的那些坑】电感选型错误导致的处理器连接不上被打赏50分 | |
【我踩过的那些坑】工作那些年踩过的记忆深刻的坑被打赏10分 | |
【我踩过的那些坑】DRC使用位置错误导致的问题被打赏100分 | |
我踩过的那些坑之混合OTL功放与落地音箱被打赏50分 |