STM32驱动舵机(附例程)

2023-05-16

一、PWM__Mode:

当计数值小于CRR寄存器值时输出为有效电平,而有效电平要根据OCXInit来设置,设置的有效电平为高则当CNT值小于设置的CRR寄存器值时输出有效电平高电平,当CNT值大于设置的CRR寄存器值时输出有效电平低电平;

二、为什么PWM模式下要设置arr(period)和psc(prescaler)呢?

        首先,ARR对应于预装载值,打个比方,当为向上计数时,计数器计数到CNT=ARR时,溢出并重新计数,所以可称ARR的值为预装载周期(此周期是在分频系数PSC下对应的周期);

        其次,PSC是预分频系数,就是将机器周期的频率进行分频,STM32F407在倍频前对应的时钟频率是84MHZ, 假如,ARR=499(0~499=500)、PSC=83(0~83=84),此时有,机器周期对应的是1/84000000(单位是s,M对应的是十的六次方),分频系数是psc=83+1=84,分频后的频率为84/84=1MHZ,对应的周期为1/1000000(由式子84/84000000得来,也就是一个时钟周期【C51里面,一个时钟周期对应12个机器周期,STM32可以自己设置而已】);

        好啦,到这里就好理解了。ARR是预装载值,PSC是预分频系数,在分频系数的分频之下,每一个装载值,对应的一个时钟周期为84/84000000,故定时器的定时实间为 ARR*PSC/(84MHz)=500*84/84000000s=0.0005s,频率也就是1/0.0005=2000Hz

        顺便提一下,ARR可理解为计数周期,这个周期代表一次定时器溢出的计数周期,即计数达到此值时就会溢出,是在PSC分频系数下得到的机器周期对应的频率下计数的周期间。

 例:在STM32F103VET6上的舵机驱动程序(270°舵机)。

舵机参数:

 程序设计思路:

         PWM初始化arr为20000,psc为72,计算的定时器周期为0.02秒,定时器频率为50hz,同时计数频率则为1M,计数周期为1us,最大计数周期为20000,servo函数里,直接更改ccr寄存器,在pwm模式设置下(pwm模式一和pwm模式二,其中一个是当CNT值小于ccr值时为高电平、大于时为低电平,另一个模式则相反),设置对应的ccr寄存器值为500起,对应pwm波形500us,500+2000/270*pwm,pwm取值0~270,得到输出有效脉宽电平500~2500us  对应 0°~270°。

(其他型号舵机驱动原理相同,如180°对应的ARR寄存器取值为500+2000/180*pwm,pwm取值0~180)

初始化程序:

/**********************************************/
//舵机初始化配置,TIM8的四个通道输出四路舵机
/**********************************************/
extern int s1_c,s2_c,s3_c,s4_c;	//记录上一次舵机角度值
void servo_Configuration1(void)	 //舵机初始化
{
	GPIO_InitTypeDef GPIO_InitStructrue;
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructrue;
	TIM_OCInitTypeDef TIM_OCInitStructrue;

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8 , ENABLE);


	GPIO_InitStructrue.GPIO_Mode=GPIO_Mode_AF_PP;
	GPIO_InitStructrue.GPIO_Pin	=GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9;
	GPIO_InitStructrue.GPIO_Speed =	GPIO_Speed_50MHz;
	GPIO_Init(GPIOC, &GPIO_InitStructrue);

	TIM_TimeBaseInitStructrue.TIM_ClockDivision=0;
	TIM_TimeBaseInitStructrue.TIM_CounterMode=TIM_CounterMode_Up;
	TIM_TimeBaseInitStructrue.TIM_Period=19999;
	TIM_TimeBaseInitStructrue.TIM_Prescaler=71;
	TIM_TimeBaseInit(TIM8,&TIM_TimeBaseInitStructrue);

	TIM_OCInitStructrue.TIM_OCMode=TIM_OCMode_PWM1;
	TIM_OCInitStructrue.TIM_OCPolarity=TIM_OCPolarity_High;
	TIM_OCInitStructrue.TIM_OutputState=TIM_OutputState_Enable;

	TIM_OCInitStructrue.TIM_Pulse=0;

	TIM_OC1Init(TIM8,&TIM_OCInitStructrue);
	TIM_OC1PreloadConfig(TIM8,TIM_OCPreload_Disable);


	TIM_OC2Init(TIM8,&TIM_OCInitStructrue);
	TIM_OC2PreloadConfig(TIM8,TIM_OCPreload_Disable);	


	TIM_OC3Init(TIM8,&TIM_OCInitStructrue);
	TIM_OC3PreloadConfig(TIM8,TIM_OCPreload_Disable);		

	TIM_OC4Init(TIM8,&TIM_OCInitStructrue);
	TIM_OC4PreloadConfig(TIM8,TIM_OCPreload_Disable);	

	TIM_CtrlPWMOutputs(TIM8,ENABLE);	//MOE 主输出使能	
	TIM_ARRPreloadConfig(TIM8,DISABLE);
	TIM_Cmd(TIM8,ENABLE);	
}

舵机角度控制程序:

/*************************************/
//TIM8的四路舵机输出,servo1、servo2、servo3和servo4
/*************************************/

void servo1(int pwm)    //pwm是设定的角度,这里pwm有效值0~270,下同
{
	if ((pwm >= 0)&&(pwm<=270))
	{		
		TIM8->CCR1= 500 + (2000/270)*pwm;
	}
	else 
	{                               /*****/
		if(pwm <0)                //限定角度最小0°,最大270°。下同。
		{TIM8->CCR1 =  500;}        /****/
		else
		{	TIM8->CCR1 =  2500;}
	}
	s1_c = pwm;
} 
void servo2(int pwm)
{
	if ((pwm >= 0)&&(pwm<=270))
	{
		TIM8->CCR2 = 500 + (2000/270)*pwm;
	}
	else 
	{
		if(pwm <0)
		{TIM8->CCR2 =  500;}
		else
		{	TIM8->CCR2 =  2500;}
	}
		s2_c = pwm;
} 


void servo3(int pwm)
{
	if ((pwm >= 0)&&(pwm<=270))
	{
		TIM8->CCR3 = 500 + (2000/270)*pwm;
	}
	else 
	{
		if(pwm <0)
		{TIM8->CCR3 =  500;}
		else
		{	TIM8->CCR3 =  2500;}
	}
	s3_c = pwm;

} 

void servo4(int pwm)
{
	if ((pwm >= 0)&&(pwm<=270))
	{
		TIM8->CCR4 = 500 + (2000/270)*pwm;
	}
	else 
	{
		if(pwm <0)
		{TIM8->CCR4 =  500;}
		else
		{	TIM8->CCR4 =  2500;}
	}
		s4_c = pwm;

}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32驱动舵机(附例程) 的相关文章

  • stm32的HAL库函数flash无法写入的问题

    记录一下对flash编程操作时出现的问题以及解决办法 问题 在使用HAL库中的HAL FLASH Program uint32 t TypeProgram uint32 t Address uint64 t Data 函数时发现总是没办法写
  • 如何在 Cortex-M3 (STM32) 上从 RAM 执行函数?

    我正在尝试从 Cortex M3 处理器 STM32 上的 RAM 执行函数 该函数会擦除并重写内部闪存 所以我肯定需要在 RAM 中 但我该怎么做呢 我尝试过的是 使用 memcpy 将函数复制到 RAM 中的字节数组 检查它是否正确对齐
  • 如何更改闪存的起始地址?

    我正在使用 STM32F746ZG 和 FreeRTOS Flash的起始地址是0x08000000 但我想把它改成0x08040000 我通过谷歌搜索了这个问题 但没有找到解决方案 我更改了链接器脚本 如下所示 MEMORY RAM xr
  • 在没有 IDE 的情况下如何使用 CMSIS?

    我正在使用 STM32F103C8T6 并想使用 CMSIS 这本质上只是寄存器定义 没有代码 让我的生活更轻松 同时仍保持在较低水平 问题是我不知道如何安装该库以便在命令行上使用 Makefile 使用 所有文档似乎都与特定于供应商的 I
  • 优化 ARM Cortex M3 代码

    我有一个 C 函数 它尝试将帧缓冲区复制到 FSMC RAM 这些函数将游戏循环的帧速率降低至 10FPS 我想知道如何分析反汇编的函数 我应该计算每个指令周期吗 我想知道CPU把时间花在哪里 在哪个部分 我确信该算法也是一个问题 因为它的
  • 138-基于stm32单片机汽车多功能仪表盘显示系统Proteus仿真+源程序

    资料编号 138 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 DHT11传感器 ds1302时钟 LED灯 蜂鸣器 电位器 制作一个基于stm32单片机汽车多功能仪表盘显示系统Proteus仿真 2 通过DHT1
  • STM32超声波——HC_SR04

    文章目录 一 超声波图片 二 时序图 三 超声波流程 四 单位换算 五 取余计算 六 换算距离 七 超声波代码 一 超声波图片 测量距离 2cm 400cm 二 时序图 1 以下时序图要先提供一个至少10us的脉冲触发信号 告诉单片机我准备
  • 物联网网关

    物联网网关是 连接物联网设备和互联网的重要桥梁 它负责将物联网设备采集到的数据进行处理 存储和转发 使其能够与云端或其它设备进行通信 物联网网关的作用是实现物联网设备与云端的无缝连接和数据交互 物联网网关功能 数据采集 物联网网关可以从物联
  • 毕业设计 江科大STM32的智能温室控制蓝牙声光报警APP系统设计

    基于STM32的智能温室控制蓝牙声光报警APP系统设计 1 项目简介 1 1 系统构成 1 2 系统功能 2 部分电路设计 2 1 stm32f103c8t6单片机最小系统电路设计 2 2 LCD1602液晶显示电路设计 2 2 风
  • STM32F103概要

    The STM32F103x4 STM32F103x6 STM32F103xC STM32F103xD and STM32F103xE are a drop in replacement for STM32F103x8 B medium d
  • STM32 GPIO工作原理详解

    STM32 GPIO介绍 1 STM32引脚说明 GPIO是通用输入 输出端口的简称 是STM32可控制的引脚 GPIO的引脚与外部硬件设备连接 可实现与外部通讯 控制外部硬件或者采集外部硬件数据的功能 以STM32F103ZET6芯片为例
  • 硬件基础-电容

    电容 本质 电容两端电压不能激变 所以可以起到稳定电压作用 充放电 电容量的大小 想使电容容量大 使用介电常数高的介质 增大极板间的面积 减小极板间的距离 品牌 国外 村田 muRata 松下 PANASONIC 三星 SAMSUNG 太诱
  • VS Code 有没有办法导入 Makefile 项目?

    正如标题所说 我可以从现有的 Makefile 自动填充 c cpp properties json 吗 Edit 对于其他尝试导入 makefile 的人 我找到了一组脚本 它们完全可以实现我想要实现的目标 即通过 VS Code 管理
  • 跟着野火学FreeRTOS:第一段(任务定义,切换以及临界段)

    在裸机系统中 系统的主体就是 C P U CPU CP U 按照预先设定的程序逻辑在 m a i n
  • 1.69寸SPI接口240*280TFT液晶显示模块使用中碰到的问题

    1 69寸SPI接口240 280TFT液晶显示模块使用中碰到的问题说明并记录一下 在网上买了1 69寸液晶显示模块 使用spi接口 分辨率240 280 给的参考程序是GPIO模拟的SPI接口 打算先移植到FreeRtos测试 再慢慢使用
  • STM32的HAL中实现单按、长按和双按功能

    我正在尝试实现单击 双击和长按功能来执行不同的功能 到目前为止 我已经理解了单击和长按的逻辑 但我不知道如何检测双击 至于代码 我使用计数器实现了单击和长按 但代码仅停留在第一个 if 条件上 bool single press false
  • Freertos低功耗管理

    空闲任务中的低功耗Tickless处理 在整个系统运行得过程中 其中大部分时间都是在执行空闲任务的 空闲任务之所以执行 因为在系统中的其他任务处于阻塞或者被挂起时才会执行 因此可以将空闲任务的执行时间转换成低功耗模式 在其他任务解除阻塞而准
  • 核心耦合内存在 STM32F4xx 上可执行吗?

    尝试从 STM32F429s CCM 运行代码 但每当我命中 CCM 中的第一条指令时 我总是会遇到硬故障 并且 IBUSERR 标志被设置 该指令有效且一致 STM32F4xx 是否可能不允许从 CCM 执行 数据访问效果良好 alios
  • 从没有中断引脚并且在测量准备好之前需要一些时间的传感器读取数据的最佳方法

    我正在尝试将压力传感器 MS5803 14BA 与我的板 NUCLEO STM32L073RZ 连接 根据 第 3 页 压力传感器需要几毫秒才能准备好读取测量值 对于我的项目 我对需要大约 10 毫秒来转换原始数据的最高分辨率感兴趣 不幸的
  • 移动数组中的元素

    我需要一点帮助 我想将数组中的元素向上移动一个元素 以便新位置 1 包含位置 1 中的旧值 new 2 包含 old 1 依此类推 旧的最后一个值被丢弃 第一个位置的新值是我每秒给出的新值 我使用大小为 10 的数组 uint32 t TE

随机推荐

  • CCF期末预测之最佳阈值

    题目背景 考虑到安全指数是一个较大范围内的整数 小菜很可能搞不清楚自己是否真的安全 xff0c 顿顿决定设置一个阈 xff0c 以便将安全指数 y转化为一个具体的预测结果 会挂科 或 不会挂科 因为安全指数越高表明小菜同学挂科的可能性越低
  • (IOS系列)——TextFile属性设置

    初始化textfield并设置位置及大小 UITextField text 61 UITextField alloc initWithFrame CGRectMake 20 20 130 30 设置边框样式 xff0c 只有设置了才会显示边
  • windows10系统自带linux子系统(WSL)的安装目录

    如题 xff0c 最近一直想能不能不用VM virtualbox Hyper V等以虚拟机方式在windows10系统中安装linux xff0c 以便打造openwrt编译环境 在网上摸索了许久 xff0c 终于找到了一种方法 xff0c
  • 智慧农业IOT-onenet平台简单介绍

    智慧农业IOT onenet平台简单介绍 1 onenet平台简介 1 1 onenet简介 OneNET是由中国移动打造的PaaS物联网开放平台 平台能够帮助开发者轻松实现设备接入与设备连接 xff0c 快速完成产品开发部署 xff0c
  • 万物互联-stm32单片机简介、烧录、编程及其项目环境搭建

    万物互联 stm32单片机简介 烧录 编程 前言 xff1a stm32单片机这里给出简单介绍 xff0c 给不了解的朋友普及下硬件端的基本知识 xff0c 叙述的较为简单 xff0c 想深入研究的朋友可以去一些官方网站 论坛 博客汲取知识
  • 万物互联-IOT-ESP8266功能、作用、AT、连接onenet服务器简单介绍

    万物互联 IOT ESP8266功能 作用 AT 连接onenet服务器简单介绍 1 ESP8266简介 1 1 ESP8266简介 ESP8266是一个完整且自成体系的 WiFi 网络解决方案 xff0c 能够独立运行 xff0c 也可以
  • 云应用系统开发技术考点(面试题相关)

    云应用系统开发技术考点 xff08 面试题相关 xff09 1 CAP理论 概述 xff1a 一个分布式系统最多只能同时满足一致性 xff08 Consistency xff09 可用性 xff08 Availability xff09 和
  • Linux常用命令大全(超详细分类版)

    Linux常用命令大全 xff08 持续收集 分类 xff09 文件操作 常用 cd home 进入 39 home 39 目录 39 cd 返回上一级目录 cd 返回上两级目录 cd 进入个人的主目录 cd user1 进入个人的主目录
  • 图的基本概念、存储及基本操作(邻接矩阵法与邻接表法)

    图的基本概念 存储及基本操作 邻接矩阵法与邻接表法 xff09 1 图的基本概念 1 1 图的定义 图 xff08 Graph xff09 是由顶点的有穷非空集合和顶点之间边的集合组成 xff0c 通常表示为 xff1a G V E xff
  • 深度优先搜索(DFS)与广度优先搜索(BFS)算法详解

    深度优先搜索 xff08 DFS xff09 与广度优先搜索 xff08 BFS xff09 详解 1 广度优先搜索算法 1 1 前言 和树的遍历类似 xff0c 图的遍历也是从图中某点出发 xff0c 然后按照某种方法对图中所有顶点进行访
  • 小程序微服务单个SSL证书部署多个项目解决方案

    小程序微服务单个SSL证书部署多个项目解决方案 玩过小程序的人 xff0c 都知道小程序上线的要求比较苛刻 xff0c 并不是上架审核苛刻 xff0c 而是前期的服务器上架比较麻烦 xff0c 需要配置SSL证书 xff0c 并且只能使用8
  • 二叉树详解及二叉树的遍历(递归与非递归C++算法实现)

    二叉树详解及二叉树的遍历 xff08 递归与非递归C 43 43 算法实现 xff09 二叉树简介 树 xff08 Tree xff09 是一种由多个节点组成的有限集合T xff0c 有且仅有一个节点称为根 xff08 root xff09
  • node.js及vue安装配置详解

    一 node js 安装配置 1 下载 首先先下载node js xff0c 通过以下链接进行选择下载 https nodejs org download release 选择自己想要的版本进行下载 2 安装 下载完成后双击node exe
  • BP神经网路详解(误差反向传播-链式求导法则)

    BP神经网络详解 简介 BP xff08 Back Propagation xff09 网络是1985年由Rumelhart和McCelland为首的科学家小组提出 xff0c 是一种按误差逆传播算法训练的多层前馈网络 xff0c 是目前应
  • OpenSSL: error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failur

    OpenSSL error 14077410 SSL routines SSL23 GET SERVER HELLO sslv3 alert handshake failure Unable to establish SSL connect
  • CV和NLP不分家

    嗯 xff0c 好久没有登陆csdn了 xff0c 看了一下 xff0c 距离上一篇文章发表已经过去了整整半年的时间了 xff0c 消息堆叠了将近100条 也没办法一一回复了 xff0c 因为这么长时间过去了 xff0c 不知道大家的问题都
  • 2022-09-14-openstack介绍

    1 云计算介绍 计算 xff08 CPU 内存 xff09 存储和网络是 IT 系统的三类资源 通过云计算平台 xff0c 这三类资源变成了三个资源池 当需要虚机的时候 xff0c 只需要向平台提供虚机的规格 平台会快速从三个资源池分配相应
  • docker debian中apt-get源替换为阿里源

    场景 docker容器内安装太慢 xff0c 实在受不了这速度了 解决方案 将默认的debian源替换为阿里源 cat命令 因为默认不带vim 查看源配置文件 xff1a span class token function cat span
  • Spring整合Junit

    原始Junit测试Spring的问题 在测试类中 xff0c 每个测试方法都有以下两行代码 xff1a ApplicationContext ac 61 new ClassPathXmlApplicationContext 34 bean
  • STM32驱动舵机(附例程)

    一 PWM Mode xff1a 当计数值小于CRR寄存器值时输出为有效电平 xff0c 而有效电平要根据OCXInit来设置 xff0c 设置的有效电平为高则当CNT值小于设置的CRR寄存器值时输出有效电平高电平 xff0c 当CNT值大