新手第一次做实验,如果有写的不对的地方,还希望各位大佬多多指导。

--------第一次做实验,也发现了自己学习过的东西掌握的不是很好,大佬们有啥入门级别的模块也可以推荐一下,分享当然更好了。

-------算是对自己学习的一种记录吧,嘿嘿!

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舵机的实验(+串口控制)相关推荐

  1. 分享一个简单的迭代学习机器人双臂控制(MATLAB)

    1 什么是迭代学习控制 迭代学习控制(iterative learning control,简称ILC)由Uchiyama于1978年首先提出,不过因为论文由日文撰写,影响不是很大.1984年,Ari ...

  2. SG90舵机的原理和控制方式

    前言 做过机器人.智能车或者玩航模的朋友应该对舵机不会陌生,这种舵机也是很常用的. 舵机只是我们通俗的叫法,它的本质是一个伺服电机,也可以叫做位置(角度)伺服驱动器.一般被应用在那些需要控制角度变化的 ...

  3. 基于STM32驱动SG90舵机

    1.舵机介绍 这边对SG90舵机进行一个简短的文字介绍: 舵机的控制一般需要一个20ms左右的时基脉冲,该脉冲的高电平部分一般为0.5ms-2.5ms范围,总间隔为2ms.脉冲的宽度将决定马达转动的距 ...

  4. 学习笔记3 Linux定时器和sg90舵机的综合应用

    今天学习了Linux的定时器功能,并复刻了学习51单片机时玩的智能感应垃圾桶项目.总体感觉难度不大. 先捏软柿子,sg90舵机,应该是市面上能能买到的最便宜的舵机了吧(我瞎说的,如果不是可以发链接给我 ...

  5. STM32通过串口控制LED闪烁或者呼吸效果

    STM32通过串口控制LED闪烁或者呼吸效果 目录 STM32通过串口控制LED闪烁或者呼吸效果 1.准备工作 2.思路分析 3.实际操作 4.小结 1.准备工作 1.首先我们需要准备32的最小系统板 ...

  6. 单片机串口控制树莓派3B播放HDMI视频,omxplayer,

    使用树莓派3B通过HDMI播放视频.并且使用串口去控制播放哪个视频. 1. 问题解耦 单片机串口控制树莓派3B播放视频? = 树莓派播放视频 + 单片机串口传参控制树莓派 树莓派播放视频:树莓派播放视 ...

  7. C51单片机定时器2实现SG90舵机控制

    谈起舵机最初的了解应用于航模,偶然的机会在网上看到有牛人使用多个舵机做人形机器人的关节,感觉这小东西很有趣,蒙发了买来学习学习的想法,这已经是多年前的事了,后来由于某些原因,这个想法直到今年才落地.小 ...

  8. 小白入门STM32(2)---控制SG90舵机---基础工作原理详解

    文章目录 序言 一.基础理论 1.1 舵机控制原理--PWM 习题 1.2 定时器 1.2.1 基础定时器 时钟装置 循环计数器 1.2.2 比较定时器 习题 二.实战上手 2.1 设置定时器和单片机 ...

  9. STM32F103:二.(4)控制SG90舵机

    先展示下定时器通道表: 参考正点原子PWM,端口号为PB5 //TIM3 PWM部分初始化 //PWM输出初始化 //arr:自动重装值 //psc:时钟预分频数 void TIM3_PWM_Init ...

最新文章

  1. 列名无效怎么解决_PowerQuery批量合并Excel,前面有空行且不相等的解决办法
  2. HDU 2896 病毒侵袭 AC自己主动机题解
  3. 编写了一个通过手机短信平台收发短信的软件
  4. 【数据库】将Excel导入达梦数据库,并执行表合并
  5. linux tr 字符串,linux tr命令-转换或删除输入的字符的
  6. MFC Radio Button笔记
  7. microsoft azure
  8. 如何自己制作身份证扫描件?
  9. 计算机驱动空间的c盘不足怎么办,C盘磁盘空间不足怎么解决
  10. [渝粤教育] 山东职业学院 话说铁道 参考 资料
  11. MFC AFX_EXT_CLASS
  12. 后台如何暴漏IP用于前后端测试
  13. HTML5网页设计基础——用户注册界面
  14. 980. 不同路径 III
  15. 闲聊,从《斗罗大陆》到游戏开发
  16. Python爬取京东商品评论和图片下载
  17. UniApp接入阿里云金融级实人认证服务
  18. Springboot自动装置原理
  19. 每周精品之淘宝20190325
  20. gb和gib的区别_KB / KiB,MB / MiB,GB / GiB,… 的区别是什么?

热门文章

  1. 汉堡式折叠html,纯CSS3菜单汉堡包按钮变形动画特效
  2. C++学生管理系统课程设计
  3. 11.监视属性——watch
  4. flutter小说阅读页之爬坑记录-半角转全角字符
  5. java bitwise_Java Core.bitwise_and方法代码示例
  6. Icpc 沈阳 Bitwise Exclusive-OR Sequence
  7. Unity导入Mixamo动画,合并Mixamo动作
  8. 计算机毕业设计Android手机校园外卖订餐APP(源码+系统+mysql数据库+Lw文档)
  9. javaweb之msql学习笔记
  10. python掷骰子猜大小