设计思路是想利用单片机采集电位器上的变化,然后把采集到的信号通过转换输送给舵机,让舵机转换相同的角度。
进程:目前还有一些细节还需要讨论,舵机型号还未选定,不过会尽快定下来。
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网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
【换取逻辑分析仪】-基于ADI单片机MAX78000的简易MP3音乐播放器被打赏48分 | |
我想要一部加热台+树莓派PICO驱动AHT10被打赏38分 | |
【换取逻辑分析仪】-硬件SPI驱动OLED屏幕被打赏36分 | |
换逻辑分析仪+上下拉与多路选择器被打赏29分 | |
Let'sdo第3期任务合集被打赏50分 | |
换逻辑分析仪+Verilog三态门被打赏27分 | |
换逻辑分析仪+Verilog多输出门被打赏24分 | |
【分享评测,赢取加热台】使用8051单片机驱动WS2812被打赏40分 | |
【换取逻辑分析仪】rtthread添加RRH62000传感器驱动-基于野火启明6M5被打赏48分 | |
换逻辑分析仪+Verilog多输入门被打赏27分 |