php控制舵机,分享一个关于SG90舵机的实验(+串口控制)
新手第一次做实验,如果有写的不对的地方,还希望各位大佬多多指导。
--------第一次做实验,也发现了自己学习过的东西掌握的不是很好,大佬们有啥入门级别的模块也可以推荐一下,分享当然更好了。
-------算是对自己学习的一种记录吧,嘿嘿!
SG90舵机的参数:
sg90.png (54.8 KB, 下载次数: 0)
sg90
2018-11-15 12:48 上传
对于舵机的控制当然就是利用pwm来控制
1——pwm:高电平时间/总的周期
2——SG90舵机的要求50H的脉冲
对于的占空比就是2.5%--12.5%
3——舵机接线
舵机接线:
pwm:橙色-PA7
VCC:红色
GND:棕色
4——我使用的是stmf103精英版
pwm——定时器3产生pwm,至于pwm的初始化没啥可说的,就是直接套用原子的pwm初始化;
TIM3_PWM_Init(199,7199); //频率是50Hz 1/50=0.02 周期计算公式为:周期=(arr+1)*(psc+1)/CLK
需求1:利用定时器控制舵机从0--180(尽可能的到达舵机的极限),刚开始想利让一度一度的转,舵机没啥反应;
解决:利用定时器4定时,至于为什么定时4(后面说);
TIM4_Int_Init(79,71); 80*72/72=80us=0.08ms //定时时间计算 time=clk/((arr+1)(psc+1))
定时器的初始化也是改了原子定时器3的实验
#include "time.h"
#include "stdio.h"
int i=0,flag=0;
double maikuan ,date;
void TIM4_Int_Init(u16 arr,u16 psc)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); //时钟使能
//定时器TIM3初始化
TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位
TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断
//中断优先级NVIC设置
NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn; //TIM3中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; //先占优先级0级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级3级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
NVIC_Init(&NVIC_InitStructure); //初始化NVIC寄存器
TIM_Cmd(TIM4, ENABLE); //使能TIMx
}
void TIM4_IRQHandler(void) //TIM4中断
{
if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET) //检查TIM4更新中断发生与否
{
i++;
if(flag==0)
{
maikuan=i*1.85/9.0; // (1.85*i*0.1/180)*200
date=195.0-maikuan;
TIM_SetCompare2(TIM3, date);
//printf("%lf\n\n",date);
}
if(flag==1)
{
maikuan=i*1.85/9.0;
date=175.0+maikuan;
TIM_SetCompare2(TIM3, date);
//printf("%lf\n\n",date);
}
if(i>250)//理论值计算完的结果是100 但是无法到达最值点
//150
//175
//200
//205
{
i=0;
flag=1;
}
TIM_ClearITPendingBit(TIM4, TIM_IT_Update ); //清除TIMx更新中断标志
}
}
对于i的确定,我现在也是不太清楚,基本是自己一个一个试出来的。如果有大佬明白了,可以在这里说一下,大家互相学习一下。
对于为什么定时0.08us——定时0.02us效果不好,自己改了一下(还是瞎改的)
目前——这样就可以做到舵机来回转动了;
需求2:利用串口控制正在转动的舵机;
方案——利用设置优先级
串口1 0 3
定时器4 3 3
但是看不到现象,并不是设置错误,是因为操作定时器4太频繁了,看不出是定时器的效果还是串口指令的作用。
解决:此法我觉得还是有点不太靠谱
在串口发送指令后,关闭定时器4+延时一定的时间+(串口指令执行完)+打开定时器,就可以看到明显的现象。
最大的难点:
串口——对于串口数据的接受和发送,在论坛也提问了几次,没有找到合适的的办法,很奔溃,新手,太菜。
#include "renji.h"
#include "usart.h"
#include "stdio.h"
#include "led.h"
#include "delay.h"
#include "time.h"
void angle_ctrl(void)
{
u16 t;
u16 len;
int delay_time;
double angle,num0,num1,num2;
double data,gao,pwm;
delay_time=500;
if(USART_RX_STA&0x8000)
{
len=USART_RX_STA&0x3fff;//得到此次接收到的数据长度 0011 1111 1111 1111
printf("\r\n您发送的消息为:\r\n\r\n");
for(t=0;t
{
USART_SendData(USART1, USART_RX_BUF[t]);//向串口1发送数据
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束
}//USART_FLAG_TC是发送完成的表示符
//TIM_Cmd(TIM4, DISABLE);
//delay_ms(delay_time);
printf("\n\n\r\r\n\n");
num0=USART_RX_BUF[0]-48;
num1=USART_RX_BUF[1]-48;
num2=USART_RX_BUF[2]-48;
printf("\n\n\r\r\n\n");
if(num2 <0 && num1 <0)
angle=num0;
else if(num2<0)
angle=num0*10+num1;
else
angle=num0*100+num1*10+num2*1;
gao=angle*20.0/180.0;
data=195.0-gao;
pwm=(200-data)/200.0*100;
TIM_SetCompare2(TIM3, data);
delay_ms(delay_time);
printf("角度值angle=%lf\r\n",angle);
printf("pwm=%.2lf%%\r\n",pwm);
USART_RX_BUF[0]=0;
USART_RX_BUF[1]=0;
USART_RX_BUF[2]=0;
USART_RX_STA=0;//串口的标志位
//TIM_Cmd(TIM4, ENABLE);
}
}
这个串口可以直接发送0--999的数据,至于更多位,类比一下,就可以。
主函数如下:
#include "stm32f10x.h"
#include "time.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "stdio.h"
#include "renji.h"
int main(void)
{
int delay_time;
delay_time = 500;
delay_init(); //延时函数初始化
LED_Init();
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
TIM3_PWM_Init(199,7199); //频率是50Hz 1/50=0.02 周期计算公式为:周期=(arr+1)*(psc+1)/CLK
TIM_SetCompare2(TIM3, 195);//200-25 //void TIM3_PWM_Init(u16 period,u16 prescaler)
delay_ms(delay_time);
delay_ms(delay_time);
//TIM4_Int_Init(79,71); 80*72/72=80us=0.08ms //定时时间计算 time=clk/((arr+1)(psc+1))
uart_init(115200); //串口初始化为115200
while(1)
{
angle_ctrl();
}
}
注:其中的led只是最开始为了检验测试串口指令是否发送成功写的。
SG90_2.png
(17.82 KB, 下载次数: 10)
2018-11-15 12:52 上传
php控制舵机,分享一个关于SG90舵机的实验(+串口控制)相关推荐
- 分享一个简单的迭代学习机器人双臂控制(MATLAB)
1 什么是迭代学习控制 迭代学习控制(iterative learning control,简称ILC)由Uchiyama于1978年首先提出,不过因为论文由日文撰写,影响不是很大.1984年,Ari ...
- SG90舵机的原理和控制方式
前言 做过机器人.智能车或者玩航模的朋友应该对舵机不会陌生,这种舵机也是很常用的. 舵机只是我们通俗的叫法,它的本质是一个伺服电机,也可以叫做位置(角度)伺服驱动器.一般被应用在那些需要控制角度变化的 ...
- 基于STM32驱动SG90舵机
1.舵机介绍 这边对SG90舵机进行一个简短的文字介绍: 舵机的控制一般需要一个20ms左右的时基脉冲,该脉冲的高电平部分一般为0.5ms-2.5ms范围,总间隔为2ms.脉冲的宽度将决定马达转动的距 ...
- 学习笔记3 Linux定时器和sg90舵机的综合应用
今天学习了Linux的定时器功能,并复刻了学习51单片机时玩的智能感应垃圾桶项目.总体感觉难度不大. 先捏软柿子,sg90舵机,应该是市面上能能买到的最便宜的舵机了吧(我瞎说的,如果不是可以发链接给我 ...
- STM32通过串口控制LED闪烁或者呼吸效果
STM32通过串口控制LED闪烁或者呼吸效果 目录 STM32通过串口控制LED闪烁或者呼吸效果 1.准备工作 2.思路分析 3.实际操作 4.小结 1.准备工作 1.首先我们需要准备32的最小系统板 ...
- 单片机串口控制树莓派3B播放HDMI视频,omxplayer,
使用树莓派3B通过HDMI播放视频.并且使用串口去控制播放哪个视频. 1. 问题解耦 单片机串口控制树莓派3B播放视频? = 树莓派播放视频 + 单片机串口传参控制树莓派 树莓派播放视频:树莓派播放视 ...
- C51单片机定时器2实现SG90舵机控制
谈起舵机最初的了解应用于航模,偶然的机会在网上看到有牛人使用多个舵机做人形机器人的关节,感觉这小东西很有趣,蒙发了买来学习学习的想法,这已经是多年前的事了,后来由于某些原因,这个想法直到今年才落地.小 ...
- 小白入门STM32(2)---控制SG90舵机---基础工作原理详解
文章目录 序言 一.基础理论 1.1 舵机控制原理--PWM 习题 1.2 定时器 1.2.1 基础定时器 时钟装置 循环计数器 1.2.2 比较定时器 习题 二.实战上手 2.1 设置定时器和单片机 ...
- STM32F103:二.(4)控制SG90舵机
先展示下定时器通道表: 参考正点原子PWM,端口号为PB5 //TIM3 PWM部分初始化 //PWM输出初始化 //arr:自动重装值 //psc:时钟预分频数 void TIM3_PWM_Init ...
最新文章
- 列名无效怎么解决_PowerQuery批量合并Excel,前面有空行且不相等的解决办法
- HDU 2896 病毒侵袭 AC自己主动机题解
- 编写了一个通过手机短信平台收发短信的软件
- 【数据库】将Excel导入达梦数据库,并执行表合并
- linux tr 字符串,linux tr命令-转换或删除输入的字符的
- MFC Radio Button笔记
- microsoft azure
- 如何自己制作身份证扫描件?
- 计算机驱动空间的c盘不足怎么办,C盘磁盘空间不足怎么解决
- [渝粤教育] 山东职业学院 话说铁道 参考 资料
- MFC AFX_EXT_CLASS
- 后台如何暴漏IP用于前后端测试
- HTML5网页设计基础——用户注册界面
- 980. 不同路径 III
- 闲聊,从《斗罗大陆》到游戏开发
- Python爬取京东商品评论和图片下载
- UniApp接入阿里云金融级实人认证服务
- Springboot自动装置原理
- 每周精品之淘宝20190325
- gb和gib的区别_KB / KiB,MB / MiB,GB / GiB,… 的区别是什么?
热门文章
- 汉堡式折叠html,纯CSS3菜单汉堡包按钮变形动画特效
- C++学生管理系统课程设计
- 11.监视属性——watch
- flutter小说阅读页之爬坑记录-半角转全角字符
- java bitwise_Java Core.bitwise_and方法代码示例
- Icpc 沈阳 Bitwise Exclusive-OR Sequence
- Unity导入Mixamo动画,合并Mixamo动作
- 计算机毕业设计Android手机校园外卖订餐APP(源码+系统+mysql数据库+Lw文档)
- javaweb之msql学习笔记
- python掷骰子猜大小