
pw1=1;
while(num!=Servo1_loop_num); /电机运行直到num=Servo1_loop_num/
pw1=0;
while(!(num==100)); /电机停止后一直等待num=100后才继续下面 *** 作/
#include <Servoh>
Arduino自带的Servo函数及其语句,先来介绍一下舵机函数的几个常用语句吧。
1、attach(接口)——设定舵机的接口,只有9或10接口可利用。
2、write(角度)——用于设定舵机旋转角度的语句,可设定的角度范围是0°到180°。
3、read()——用于读取舵机角度的语句,可理解为读取最后一条write()命令中的值。
4、attached()——判断舵机参数是否已发送到舵机所在接口。
5、detach()——使舵机与其接口分离,该接口(9或10)可继续被用作PWM接口。
注:以上语句的书写格式均为“舵机变量名具体语句()”例如:myservoattach(9)。
下面就来具体分析一个小程序。
#include <Servoh>//定义头文件,这里有一点要注意,可以直接在
Arduino软件菜单栏单击Sketch>Importlibrary>Servo,调用Servo函数,也可以直接输入#include <Servoh>,但是在输入时要注意在#include 与<Servoh>之间要有空格,否则编译时会报错。
Servo myservo;//定义舵机变量名
void setup()
{
myservoattach(9);//定义舵机接口,9或10
}
void loop()
{
myservowrite(90);//设置舵机旋转的角度
}
//12MHz
#include <reg51h>
void InitTimer0(void)
{
TMOD = 0x01;
TH0 = 0x0B1;
TL0 = 0x0E0;
EA = 1;
ET0 = 1;
TR0 = 1;
}
void delay(void) //误差 0us 延时1ms 此处可以修改高电平周期
//修改此处的延时可以更改舵机转的角度 ,45度具体是多少 你可以试试
{
unsigned char a,b,c;
for(c=1;c>0;c--)
for(b=142;b>0;b--)
for(a=2;a>0;a--);
}
void main(void)
{
InitTimer0();
P1_2=0;
while(1);
}
void Timer0Interrupt(void) interrupt 1
{
//20ms中断
TH0 = 0x0B1;
TL0 = 0x0E0;
P1_2=1;
delay();
P1_2=0;
}
看一下舵机控制器主芯片旁边的双排针,使用RS232来控制的时候是有条线帽的,您要使用Arduino控制需要将条线帽拆除,用四根杜邦线连接内侧的排针和UNO控制器,连接之前将程序导入到UNO控制器中,接线顺序为:TX-RX,RX-TX,+接电源正,-接GND然后给舵机供电,就可以使用UNO控制器来控制32路舵机控制器了。
清单
STM32F103C8T6 1个,Jlink下载线 1根
MG90S舵机 1个
12V电源 1个,12V转5V降压模块(给舵机供电) 1个
杜邦线数根
MG90S舵机
如图所示,舵机有三根线,红色接5V正极,黑色接地;**为信号线,接收PWM信号
实物图
输出PWM控制舵机
STM32控制舵机,总的来说是向舵机信号线发送周期为20ms的PWM(Pulse Width Modulation 脉冲宽度调制)信号来控制舵机转角,PWM脉冲的占空比决定了舵机的转角位置,对应关系如下图;
STM32靠定时器TIM实现PWM信号的输出,STM32有多个定时器,分为通用定时器和高级定时器,每个通用定时器都可以输出4路PWM,本文采用TM2_CH4,及定时器2的第4路PWM;对应STM32F103C8T6上的PB11引脚;
创建工程输出PWM
本文使用STM32CubeMX创建工程,更加简单高效,即便对单片机不熟悉也可 *** 作成功;
一、打开STM32CubeMX,新建一个工程,搜索并选择STM32F103C8,然后start project;
二、进行基本设置,配置RCC、SYS、HCLK
RCC -> 设置高速外部时钟HSE 选择外部时钟源
SYS -> 选择Debug方式 serial wire
HCLK -> 设置为72MHZ
三、设置定时器
选择TIM2
选择内部时钟源
设置Channel4为PWM模式
右侧对应管脚自动设置为复用模式
设置定时器参数
控制舵机我们需要设置PWM输出一个周期时间为20ms的信号,定时器时钟为72Mhz
预分频Prescaler设置为720-1,则单周期为72M/(Prescaler + 1) = 100Khz(001ms)
以20ms为周期,则Counter Period为20ms/001ms - 1 = 1999
此处可设定默认脉冲宽度为05ms,及05/202000 = 50
四、接下来设置输出格式
添加工程名PWM
修改IDE为MDK-ARM V5
在Code Genetator中设置包含库与工程格式
至此STM32CubeMX已设置完成,接下来GENERATE CODE,并打开文件;
在main函数中启动定时器,并输出一定的脉冲的PWM信号即可驱动舵机;
五、修改代码
在mainc文件相应位置处添加如下代码
启动PWM输出
输出PWM信号
/ USER CODE BEGIN Includes /
#include "stdioh"
/ USER CODE END Includes /
/ USER CODE BEGIN 2 /
HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_4); //启动定时器
int compareValue = 150; //将compareValue设置为50、150、250分别对应0°、90°、180°
/ USER CODE END 2 /
/ Infinite loop /
/ USER CODE BEGIN WHILE /
while (1)
{
/ USER CODE END WHILE /
/ USER CODE BEGIN 3 /
__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_4, compareValue); //输出PWM信号
HAL_Delay(10);
}
/ USER CODE END 3 /
}
登录后复制

添加完以上代码之后,编译,然后通过JLink将程序LOAD到STM32F103C8T6,将舵机信号线连接PB11(TIM2_CHANNEL4)口,并接上电源,舵机即可转动到指定角度;由以上定时器设定可知,compareValue值50、150、250 对应 05ms、15ms、25ms 对应 0°、90°、180°;若想让舵机连续转动,在50~250内循环改变compareValue值即可;
六、接线
开始时用单片机的5V输出给舵机供电,舵机哒哒哒响,但是不转,怀疑是供电不给力,单独供电后驱动成功;
JIink连接电脑和单片机,下载程序到单片机并给单片机供电
舵机**信号线接STM32F103C8T6引脚PB11,接收PWM信号
舵机红色电源线接稳压板5V输出正极,舵机黑色地线需与单片机地相连
调试
实 *** 中可能会出现各种各样的问题,以下有几种调试方法
一、舵机测试
调试模块一端接电,一段接舵机,手动模式下,舵机会跟着旋钮同步旋转,可以用来测试舵机是否健康;
二、串口调试助手
可下载串口调试助手,用ttl转USB模块连接电脑,在特定位置进行打印输出,检查程序是否按预设运行
stm32
#include<reg52h>
#define uint unsigned int
#define uchar unsigned char
uint count;
uchar jd;
sbit le1=P1^0; //光电传感器//
sbit PWM=P3^5; //舵机pwm//
init()
{
TMOD=0x01;//设定定时器
TH0 = 0xFE;
TL0 = 0x0c;//设定定时初始值
EA=1;
ET0=1;
TR0=1;
}
void delay(uint z) //延时
{
uint x,y;
for(x=z;x>0;x--)
for(y=125;y>0;y--);
}
void timer0() interrupt 1 //产生pwm信号控制舵机,周期20ms
{
TH0 = 0xFE;
TL0 = 0x0c; //设定定时初始值
if(count<jd) //判断05ms次数是否小于角度标识
{
PWM=1; //确定小于,pwm输出高电平
// delay(180); //延时一会,可以减慢舵机转速
}
else
PWM=0; //大于则输出低电平
count=count+1; //05ms次数加1
count=count%40; //次数始终保持为40即保持周期为20ms
}
void xunji() //循迹函数,读取光电管状态
{
if(le1!=0)
{
delay(10);
if(le1==0)
{
jd++;
count=0;
while(le1==0);
}
} //分析光电管状态,看你的电路检测到黑线输出1或者是0
else
{
count=0;
jd=3; //舵机归中
}
}
void main()
{
jd=3; //角度初始化90°: 1=05ms 舵机为0° 2=1ms 舵机为45°3、4、5、同上
count=0; //初始化赋值零
init(); //定时器初始化
while(1)
{
xunji(); //舵机检测
}
}
以上就是关于提高分求助。我有一个单片机控制四个舵机的程序。请各位帮我解释一下程序,我看不太明白。全部的内容,包括:提高分求助。我有一个单片机控制四个舵机的程序。请各位帮我解释一下程序,我看不太明白。、arduino 控制舵机、如何写舵机转角程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)