问题:

给占空比不转————定时器输出极性为低,有效电平为低电平,;在向上计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为无效电平,即高电平,我弄反了

转任意角度失败---------似乎这个舵机只能转-90,-45,0,45,90度。

#include "duoji.h"
#include "led.h"
#include "sys.h"
#include "usart.h"
//
//让SG90的黄色标记朝向你,白色指针垂直于标记即为0度位置,顺时针为正旋转角度,逆时针为负旋转角度
//只能转-90,-45,0,45,90度
//       //通用定时器3中断初始化
//这里时钟选择为APB1的2倍,而APB1为36M
//arr:自动重装值。
//psc:时钟预分频数
//这里使用的是定时器3!
void TIM3_Int_Init(u16 arr,u16 psc)
{TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能//定时器TIM3初始化TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值   TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_timTIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断//中断优先级NVIC设置NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  //TIM3中断NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占优先级0级NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //从优先级3级NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能NVIC_Init(&NVIC_InitStructure);  //初始化NVIC寄存器TIM_Cmd(TIM3, ENABLE);  //使能TIMx
}
//定时器3中断服务程序
void TIM3_IRQHandler(void)   //TIM3中断
{if (TIM_GetITStatus(TIM3, TIM_IT_Update) == SET)  //检查TIM3更新中断发生与否{TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );  //清除TIMx更新中断标志 }
}//PC6:舵机1 PC7:舵机2
void TIM3_PWM_Init(u16 arr,u16 psc)
{GPIO_InitTypeDef GPIO_Initstructure;TIM_TimeBaseInitTypeDef TIM_TimeBaseInitstructure;TIM_OCInitTypeDef TIM_OCInitstructure;TIM_OCInitTypeDef TIM_OCInitstructure1;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_AFIO,ENABLE);//GPIO初始化GPIO_Initstructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_Initstructure.GPIO_Pin = GPIO_Pin_7|GPIO_Pin_6;GPIO_Initstructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOC,&GPIO_Initstructure);//完全重映射GPIO_PinRemapConfig(GPIO_FullRemap_TIM3,ENABLE);//初始化定时器arr、pscTIM_TimeBaseInitstructure.TIM_ClockDivision = 0;TIM_TimeBaseInitstructure.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseInitstructure.TIM_Period = arr;TIM_TimeBaseInitstructure.TIM_Prescaler = psc;TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitstructure);//初始化比较参数TIM_OCInitstructure.TIM_OCPolarity = TIM_OCPolarity_High;//注意有效电平为高电平TIM_OCInitstructure.TIM_OCMode = TIM_OCMode_PWM1;// 在向上计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为无效电平TIM_OCInitstructure.TIM_OutputState = TIM_OutputState_Enable;TIM_OC2Init(TIM3,&TIM_OCInitstructure);TIM_OCInitstructure1.TIM_OCPolarity = TIM_OCPolarity_High;//有效电平为高电平TIM_OCInitstructure1.TIM_OCMode = TIM_OCMode_PWM1;// 在向上计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为无效电平TIM_OCInitstructure1.TIM_OutputState = TIM_OutputState_Enable;TIM_OC1Init(TIM3,&TIM_OCInitstructure1);//使能预装载寄存器NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;NVIC_InitStructure.NVIC_IRQChannelSubPriority=2;NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;NVIC_Init(&NVIC_InitStructure);TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable);TIM_OC1PreloadConfig(TIM3,TIM_OCPreload_Enable);TIM_ARRPreloadConfig(TIM3, ENABLE); //使能TIMx在ARR上的预装载寄存器//使能定时器TIM_Cmd(TIM3,ENABLE);
//      TIM_ITConfig(TIM3,TIM_IT_Update|TIM_IT_CC1,ENABLE);
}
//只针对通道一
void Set_Pwm1_Dutycycle(TIM_TypeDef* TIMx,int arr,float Dutycycle)
{
//  TIM_OC1PreloadConfig(TIMx,TIM_OCPreload_Enable);失能CCR预装载寄存器,直接拷贝到影子寄存器TIM_Cmd(TIM3,ENABLE);Dutycycle=(int)(arr*Dutycycle);TIM_SetCompare1(TIMx,Dutycycle);
}
//此函数计算量大,实测失败;
void Rotate_degree(int degree)
{if(degree>0) {float dutycycle=(1.5+degree*(1/90))/20;Set_Pwm1_Dutycycle( TIM3,19999, dutycycle);}else{float dutycycle=(1.5-degree*(1/90))/20;Set_Pwm1_Dutycycle( TIM3,19999, dutycycle);}}
//舵机的控制信号为PC6输出的PWM信号,周期为20ms,其中脉冲宽度从0.5ms~2.5ms,对应舵盘的0°到180°,呈线性变/化。
//也就是说,给舵机提供一定的脉宽,它的输出轴就会保持在一个与之对应的角度上,直到下一个不同的脉宽出现/,转到新的对应角度。
#ifndef __TIMER_H
#define __TIMER_H
#include "sys.h"///*转速控制:175<=s<185 反向转  185<s<=195 正向转 s=185 静止*/
//#define ZSPEED 195  //正向最大转速
//#define STAY   185  //速度为0
//#define FSPEED 175  //反向最大转速
//
/*
一。简介外设:云台适用板子:STM32F103ZET6包含文件:duoji.h  duoji.c接口:PC6 舵机一信号线(一般是橙色)PC7 舵机二信号线
二。使用方法初始化:TIM3_PWM_Init(199,7199);平转调用函数:TIM_SetCompare1(TIM3,SPEED);//舵机一转向,SPEED:转速和方向TIM_SetCompare2(TIM3,SPEED);//舵机二转向,SPEED:转速和方向
*/
//   void TIM3_Int_Init(u16 arr,u16 psc);void TIM3_PWM_Init(u16 arr,u16 psc);void Set_Pwm1_Dutycycle(TIM_TypeDef* TIMx,int arr,float Dutycycle);void Rotate_degree(int degree);
#endif

SG90舵机驱动,有代码相关推荐

  1. STM32的SG90舵机驱动

    今天来讲一下如何使用STM32来驱动SG90舵机 舵机:舵机是一种位置(角度)伺服的驱动器,适用那些需要角度不断变化并可以保持的控制系统.舵机只是一种通俗的叫法,其实质是一个伺服马达. 驱动SG90舵 ...

  2. STM32驱动sg90舵机失败

    背景:        十月份参加学校举办的Robomaster校内赛,使用sg90舵机驱动机械臂夹取小球. 遇到问题:        使用STM32单片机的定时器输出PWM来驱动舵机,一直无法使舵机运 ...

  3. arduino几种供电方式 附加多9g舵机驱动 2021 8 24

    前言:在使用arduino uno时要考虑供电, 总结一下几种供电方法 方法一:使用USB端口为Arduino供电 USB端口通常在烧录时进行供电以及实验时使用,也可以用充电宝配合使用,使用这种方法供 ...

  4. ESP8266驱动SG90舵机控制开关灯(灯的开关)的折腾记录

    https://blog.csdn.net/qq_47749454/article/details/117638828 想法来源地址在上面,可以去参考一下,建议是结合两篇文章一块看,按照大佬的先来折腾 ...

  5. K210、Openmv与串行总线舵机通信(基于micropython)舵机驱动板和舵机控制板代码

    最近博主在使用幻尔公司 串行总线舵机时,想使用k210控制,由于官方没有相关例程(树莓派的版本是python版本代码,用不了)特此分享一下控制代码 主要调用函数 a.to_bytes(x,'littl ...

  6. 基于STM32驱动SG90舵机

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

  7. arduino 舵机接线图_arduino+16路舵机驱动板连接测试(示例代码)

    用Arduino类库驱动舵机并不是一件难事,如果需要驱动很多电机,就需要要占用更多的引脚,也会影响到Arduino的处理能力.专门的舵机驱动板很好的解决了这个问题. 此舵机驱动板使用PCA9685芯片 ...

  8. Arduino 不使用舵机库<Servo.h>驱动SG90舵机

    点击下载示例 由于<Servo.h>中使用了定时器,严重影响了其他引脚的信号变化.所以自行写了个简单的驱动程序. 舵机驱动原理如下: 舵机的控制信号为周期是 20ms 的(PWM)信号,其 ...

  9. STM32F103单片机控制SG90舵机

    前言 在智能衣柜系统中,试用SG90旋转0°-180°,模拟衣柜的开关门,舵机正转开门,180°-0°反转模拟一个关门的现象. 一,SG90舵机 1.1SG90链接: [淘宝]https://m.tb ...

  10. Baize_ServoDriver_esp8266-(arduino32路舵机驱动板)(开源可自制,附程序和固件以及烧录方法)

    导航在这里:白泽六足机器人_arduino_v1 介绍 先放资料 github:GitHub - Allen953/Baize_ServoDriver_esp8266 立创开源地址:https://o ...

最新文章

  1. MySQL InnoDB锁机制全面解析分享
  2. 推荐常用算法之-基于内容的推荐(转自-BreezeDeus博主)
  3. 【网址收藏】dubbo特新概念及特性、环境搭建、dubbo-monitor安装、rpc原理以及dubbo原理:框架设计、启动解析加载配置信息、服务暴露、服务引用及调用
  4. 自旋锁和互斥锁实例_多线程编程之自旋锁
  5. 软考一般知识之数据库
  6. 如何仅用300行代码完成spring基本框架?
  7. Python——元组Tuple
  8. 剑指offer最新版_剑指offer第二版速查表
  9. 阿里技术专家带你使用Spring框架快速搭建Web工程项目
  10. Python项目开发基础 -- with open (filename) as 读写文件
  11. 常遇电脑故障应急处理方法(转)
  12. NAT配置正确,但不能ping通外网的原因
  13. 模拟登陆广工统一认证系统
  14. IDEA中工程结构讲解
  15. mysql的组内排序生成序号_sql 分组查询,组内排序, 组内添加序号 (SQL Server 排序函数 ROW_NUMBER和RANK 用法总结)...
  16. PHP中mysql查询全部过程_PHP到MySQL数据查询过程概述_MySQL
  17. CSS:“ ”这个符号在css中一般用 arial字体
  18. AUTO CAD 偏移命令的使用方法
  19. 微信朋友圈怎么发文字?微信怎么发朋友圈只发文字?
  20. python实用大全pdf_超级实用干货|九大技巧,带你用Python玩转PDF

热门文章

  1. oracle常用数据字典 表,Oracle数据库中常用的数据字典表和视图
  2. 安卓系统如何访问wincc服务器,wincc客户端读取服务器数据库
  3. java定时每周执行一次_Spring 定时任务如何实现每周一某个时间执行?
  4. R数据分析:方法与案例详解--自学笔记
  5. oracle临时表中数据消失了,oracle 临时表的使用
  6. C# 操作Excel(不需要安装Excel),.Net版的 Excel 控件
  7. 线性分类器(Linear Classifier)
  8. Alitum Designer 16安装
  9. 关于ms17010渗透
  10. 微软已修复Windows10蓝屏死亡(BSOD)错误