STM32微控制器综合实训11 伺服电机控制器设计实验

article/2025/9/17 13:47:57
实验11 伺服电机控制器设计实验
了解伺服电机的应用领域,掌握伺服电机的速度控制模式、伺服电机的位置控制模式。

文章目录

  • 程序设计
    • 伺服电机的速度控制模式代码讲解
      • main.c
      • timer.c
    • 伺服电机的位置控制模式代码讲解
      • main.c
      • timer.c
  • 编译仿真
    • 伺服电机的速度控制模式
    • 伺服电机的位置控制模式
  • 遇到的错误
  • 总结

程序设计

伺服电机的速度控制模式代码讲解

main.c

#include "delay.h"  
#include "key.h"  
#include "timer.h"  extern u8 dir;   int main(void)   
{        u8 Key_Value=0;gpio_init();   //有一个定时器通道3      delay_init();            //延时函数初始化      KEY_Init();                     //按键初始化      NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);         TIM2_PWM_Init(72000000/2000-1,0);         TIM3_Int_Init(359,1000);      TIM_Cmd(TIM2,DISABLE);      //定时器2和定时器3默认不开启      TIM_Cmd(TIM3,DISABLE);     while(1)      {          . . . . . .     }  
}

1、TIM2_PWM_Init

TIM2_PWM_Init(72000000/2000-1,0);     
//72000000/2000=36000  
//不分频,PWM启动频率=72000000/36000=2000Hz  

TIM2_PWM_Init(72000000/2000-1,0)
参数1:72000000/2000-1,溢出值(从0开始)
参数2:0,分频值(从0开始)
通过该段代码使TIM2产生一个PWM方波。

2、TIM3_Int_Init

TIM3_Int_Init(359,1000);  
//(72000000/1000)/360=200Hz  
//5ms改变一次频率 
//定时器3的溢出中断去调节定时器2产生的方波的频率  

TIM3_Int_Init(359,1000)
参数1:4999,溢出值(从0开始)
参数2:7199,分频值(从0开始)
72MHz÷1000=72KHz,计数到360为5ms,即每5ms进一次中断。
通过该段代码使TIM3每5ms进入一次中断判断是加速减速还是匀速。

3、while

while(1)  
{      Key_Value|=KEY_Scan();      if((Key_Value&0x01) ==1)    {          if(Key_Value>>7==0)       //按下独立按键,开始发脉冲,电机加速至最高转速          {              dir=1;//每次溢出中断,另脉冲频率开始升高              Key_Value =1<<7;//Key_Value最高位 0代表电机未开启   1代表电机已开启              TIM_Cmd(TIM3,ENABLE);   //开启定时器2和定时器3,PA.2管脚开始输出脉冲              TIM_Cmd(TIM2,ENABLE);          }          else if(Key_Value>>7==1)//第二次按下独立按键,电机减速至停止              //最高位如果等于1          {              Key_Value =0;               //按键值清零             dir=0; //每次溢出中断,另脉冲频率开始降低              TIM_Cmd(TIM3,ENABLE);   //重新打开定时器3,开始改变频率           }      }      
} 

第一个段代码Key_Value|=KEY_Scan(),用于改变Key_Value的值,我们对KEY_Scan go to definition。

//按键处理函数  
//返回按键值  
//0,KEY0松开  
//1,KEY0按下  
u8 KEY_Scan(void)  
{          //按一下,从0到高速      //再按一下,从高速变为0      static u8 key_up=1;//按键按松开标志            if(key_up && KEY0==0)//按键松开并且KEY0被按下      {          delay_ms(10);//去抖动           key_up=0;          if(KEY0==0) return 1;      }      else if(KEY0==1)key_up=1;        return 0;// 无按键按下  
}  

代码解释:
key_up作为子程序KEY_Scan的局部静态变量,当没有键按下时,图中第10行的if条件不成立,key_up仍然为1,KEY_Scan直接return 0,KEY_Scan结束执行;当有按键按下时,第10行的if成立,执行if语句(由于程序执行周期远远小于人按键松开时间,所以认为执行1个周期期间key_up一直为1),延迟消抖后,key_up变为0,同时执行嵌套的if语句来再次判断是哪个键被按下,并且return对应的键值。尽管main高速调用KEY_Scan,但由于key_up是static类型的变量,会继承上一次调用的值,也即是说key_up=0,不执行第10行if,KEY_Scan的return为0。直到按键完全松开,执行第16行程序,key_up重新为1。做到了按下按键只返回一次对应值。

回到while,当第一次按下按键,则执行语句Key_Value | = KEY_Scan(),Key_Value = 1。此时Key_Value的最高位为0,所以Key_Value >> 7 = = 0成立,加速标志dir = 1,表示加速,同时另Key_Value的为高位为1,最后开启定时器2和定时器3来产生PWM方波和控制加减速。

if(Key_Value>>7==0)   //按下独立按键,开始发脉冲,电机加速至最高转速  
{      dir=1;//每次溢出中断,另脉冲频率开始升高      Key_Value =1<<7;//Key_Value最高位 0代表电机未开启   1代表电机已开启          //把最高位至1      TIM_Cmd(TIM3,ENABLE);   //开启定时器2和定时器3,PA.2管脚开始输出脉冲      TIM_Cmd(TIM2,ENABLE);  
}  

第二次按下按键,由于Key_Value的为高位为1,所以Key_Value>>7 = = 1成立,另Key_Value = 0,则加速标志dir = 0,表示减速,重新打开定时器3,开始改变速度。

else if(Key_Value>>7==1)//第二次按下独立按键,电机减速至停止  
//最高位如果等于1  
{      Key_Value = 0;  //按键值清零      dir = 0;    //每次溢出中断,另脉冲频率开始降低     TIM_Cmd(TIM3,ENABLE);//重新打开定时器3  
}

timer.c

TIM3_IRQHandler

void TIM3_IRQHandler(void)   //TIM3中断  
{      if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)         {          TIM_ClearITPendingBit(TIM3, TIM_IT_Update);              if(dir==1)      //加速标志              if(freq1<62000)      //最高频率62KMz              {                  freq1+=100;                              PWM_Change(freq1);              }             if(dir==0)          //减速标志              if(freq1>2000)   //最低频率2KMz              {                  freq1 -=100;                              PWM_Change(freq1);              }              if(dir==1&&freq1>=62000) //如果加速达到最高频率,则关闭定时器3,定时器2输出最高频率的脉冲,电机匀速运行                TIM_Cmd(TIM3,DISABLE);            if(dir==0&&freq1<=2000) //如果减速至2000Hz以下,则关闭定时器2和定时器3,停止输出脉冲,电机停止运行              {                  TIM_Cmd(TIM2,DISABLE);                  TIM_Cmd(TIM3,DISABLE);              }          }  
}

由于main.c中初始化了TIM3_Int_Init(359,1000),所以每5ms发生一次溢出中断,判断一次加速标志dir,再修改或保持一次频率。
通过定时器3溢出中断发现,函数PWM_Change修改了频率,所以对PWM_Change go to definition

//改变频率  
void PWM_Change(u32 freq)  
{      u16 arr,psc;      arr=72000000/freq-1;            psc=0;//不分频      TIM2_PWM_Init(arr,psc); //使用新的参数配置定时器,改变定时器的周期      TIM_Cmd(TIM2,ENABLE);       //开启定时器2  
}  

由函数可知,最终是调整了定时器2输出PWM的溢出周期arr的值来改变转速。

void TIM2_PWM_Init(u16 arr,u16 psc)  
{          . . . . . .    TIM_SetCompare3(TIM2,arr/2);  
}  

TIM2_PWM_Init多了这一句话,在初始化里面改变了比较点。

伺服电机的位置控制模式代码讲解

main.c

while(1)  
{      num_plus_setting=100;   //脉冲个数设定值      if(KEY_Scan())         running_motor=1;    //电机启动      if(running_motor)                 TIM_Cmd(TIM2,ENABLE);//定时器2使能      else          num_plus_now=0;//当前脉冲个数清零    
}

如果有按键按下,则第5行的if判断成立,另running_motor=1;同时第7行的if判断也成立,则开启定时器2。如果没有按键按下,则running_motor=0,当前脉冲个数清0。

timer.c

TIM2_IRQHandler

定义了三个变量:
按键按下时的标志位,u8 running_motor;
当前的脉冲个数:u32 num_plus_now;
设定的脉冲个数:num_plus_setting。
在这里插入图片描述
当有按键按下时, running_motor=1,第2行的if判断成立,则定时器2每溢出一次,当前的脉冲个数num_plus_now自加1。

接着根据当前的脉冲个数num_plus_now的大小,判断伺服电机是应该加速还是应该减速,生成相应的加速标志dir=1或者减速标志dir=0。

最后根据标志来进行加速或减速。

编译仿真

伺服电机的速度控制模式

打开仿真
在这里插入图片描述
点击示波器:
在这里插入图片描述
弹出如下示波器页面:
在这里插入图片描述
点击set up增加变量
在这里插入图片描述
点击左边的方框,添加PORTA.2,同时把Display Type改为改为Bit。
在这里插入图片描述
点击运行
在这里插入图片描述
第一次点击PE.3,伺服电机加速,看到频率由低到高,后达到稳定。
在这里插入图片描述
第二次点击PE.3,伺服电机减速,看到频率由高变低,最后变为低电平。
在这里插入图片描述

伺服电机的位置控制模式

打开仿真
在这里插入图片描述

点击示波器:
在这里插入图片描述
弹出如下示波器页面:
在这里插入图片描述

点击set up增加变量
在这里插入图片描述

点击左边的方框,添加PORTA.2,同时把Display Type改为改为Bit。
在这里插入图片描述
点击运行
在这里插入图片描述
点击PE.3,伺服电机先加速后减速,看到频率由低到高在变低。

在这里插入图片描述

遇到的错误

遇到的错误:把TIM_SetCompare3注释,仿真还是会出现波形。
在这里插入图片描述
TIM_SetCompare3(TIM2,arr/2)注释后,比较点就不会再变化了;由于每次溢出中断都会调用PWM_Change函数来改变arr的值,导致溢出周期却还在一直变化,所以波形频率才会变化。

解决错误:

取消对TIM_SetCompare3(TIM2,arr/2)的注释。
在这里插入图片描述
在这里插入图片描述

成功运行

总结

在这里插入图片描述

在这里插入图片描述


http://chatgpt.dhexx.cn/article/1pPG9yS0.shtml

相关文章

伺服电机PID控制及增益调节

1、伺服电机3环 电流环&#xff1a;最内环&#xff0c;此环在伺服启动器内进行&#xff0c;装在线圈上的霍尔元件通过检测磁场强度转化为电流&#xff0c;把电流负反馈给输入端。电流环是控制的根本&#xff0c;任何控制都是通多电流来作为媒介控制的。可用于转矩控制&#xf…

STM32脉冲伺服电机控制器参考技术方案

STM32脉冲伺服电机控制器参考技术方案 id661871202965&

三菱伺服电机控制实例

三菱伺服电机控制实例&#xff0c;&#xff08;PLC程序&#xff0c;触摸屏&#xff0c;伺服参数&#xff0c;整套&#xff0c;Q系列&#xff0c;也可FX系列&#xff0c;自己设计&#xff0c;不理解可以解释各功能&#xff09;&#xff09;&#xff08;参数设置)MR-J4&#xff0…

伺服电机三环控制

伺服电机三环控制 简介电流环、速度环、位置环PIDPID 控制代码 简介 伺服电机一般为三个环控制&#xff0c;分别是电流环、速度环、位置环&#xff0c;如下图所示 频率不一样是由他们所在的控制环的位置决定的&#xff0c;位置越靠内&#xff0c;采样频率自然需要越高。根据香…

松下伺服电机pwm控制连线_从零打造树莓派家庭监控 (一): 伺服电机控制

本文首发自我的博客 MikeTech 现在很多家庭喜欢购买一个摄像头来监控家里的情况,但是往往却无法了解购买第三方摄像头的安全性,摄像头泄露的新闻也每过一段时间就会出现在人们的视野当中。如果购买的摄像头拥有云端查看的功能,那么摄像头录制下来的内容肯定是要上传到摄像头…

3种伺服电机控制方式

伺服电机速度控制和转矩控制都是用模拟量来控制&#xff0c;位置控制是通过发脉冲来控制。具体采用什么控制方式要根据客户的要求以及满足何种运动功能来选择。 接下来&#xff0c;给大家介绍伺服电机的三种控制方式&#xff1a; 如果您对电机的速度、位置都没有要求&#xf…

伺服电机控制工程 伺服电机开发实例 modbus开发源码C# winform位置模式力矩模式

伺服电机控制工程 伺服电机开发实例 modbus开发源码C# winform位置模式力矩模式 本工程源码编译环境是visual studio &#xff08;最好采用2013以上版本&#xff09;&#xff0c;编写语言是C# &#xff0c;winform工程。 本工程可以实现电脑上位机与伺服电机进行modbus串口通信…

伺服电机要计算机控制,一种伺服电机的控制方法与流程

本发明涉及机械控制技术领域,尤其涉及一种伺服电机的控制方法。 背景技术: 随着机械控制领域的高速发展,对于伺服电机的需要也日益增加,因此对于伺服 电机的控制已引起越来越多人的重视。目前传统的伺服电机的采用的是BLDC控制方法,这 是一种基于方波的驱动控制方式。这种…

verilog实现伺服电机控制

本工程可以实现伺服电机控制 编程语言是verilog 仿真截图如下: 顶层模块如下: module pid_motion_speed( //input sys_clk, //时钟 sys_rst_n, //复位 key, …

PLC是怎么控制伺服电机的?又该如何设计一个伺服系统?

导读 在了解PLC如何控制伺服电机之前&#xff0c;我们要明确两个问题&#xff1a;PLC是怎么控制伺服电机的&#xff1f;以及如何设计一个伺服系统&#xff1f;然后从这两个问题下手&#xff0c;开始详细的讲述PLC如何控制伺服&#xff0c;它们是怎么相辅相成的&#xff01; 一…

伺服电机控制

前言&#xff1a;感谢各位大佬愿意将知识开源并作出详细的说明。我只是依据自己的学习轨迹稍作整理&#xff0c;加以自己的理解并记录于此。本文几乎所有的参考内容都附上了原文链接&#xff0c;本文的文字内容有一些是我的&#xff0c;有一些是从链接中粘贴出来的&#xff0c;…

伺服控制的三环控制原理及整定仿真和Simulink模型

伺服控制的三环控制原理及整定仿真和Simulink模型 我们平时使用的工业伺服&#xff0c;通常是成套伺服&#xff0c;即驱动器和电机型号存在配对关系。但有些时候&#xff0c;我们要用电机定转子和编码器制作非成套电机——例如机床上使用的直驱转台、永磁同步电机直接驱动的主轴…

伺服电机基本概念解析:伺服系统组成及其控制原理

本文将永久处于维护序列&#xff0c;如您对文章内容有所疑问&#xff0c;还请提出&#xff0c;共同探讨。 -2021.8.25 参考文献 [1] 向晓汉, 宋昕. 变频器与步进/伺服驱动技术完全精通教程[M]. 第1版. 北京:化学工业出版社, 2015b. [2] 梁森, 欧阳三泰, 王侃夫. 自动检测技术及…

三种伺服电机控制方式总结

伺服电机速度控制和转矩控制都是用模拟量来控制&#xff0c;位置控制是通过发脉冲来控制。具体采用什么控制方式要根据客户的要求以及满足何种运动功能来选择。 接下来&#xff0c;给大家介绍伺服电机的三种控制方式&#xff1a; 如果您对电机的速度、位置都没有要求&#xff0…

面试题:Ajax、Fetch、Axios三者的区别

Ajax 它的全称是&#xff1a;Asynchronous JavaScript And XML&#xff0c;翻译过来就是“异步的 Javascript 和 XML”。 Ajax 是一个技术统称&#xff0c;是一个概念模型&#xff0c;它囊括了很多技术&#xff0c;并不特指某一技术&#xff0c; Ajax 是一种思想&#xff0c;X…

最新最全的前端面试题集锦之 Ajax、Fetch、Axios 篇

该内容主要整理关于 Axios 的相关面试题&#xff0c;其他内容面试题请移步至 2021 最新最全的前端面试题集锦 查看。 目录 一、Ajax 相关面试题1、概念2、作用3、创建 Ajax4、Ajax 状态和 HTTP 状态码5、Ajax 中常用的属性和方法6、思考&#xff1a;post 和 get 有什么区别 二、…

【面试题】Ajax

1. Ajax请求 1.1 get请求方式 const xml new XMLHttpRequest() xml.open("get", "test.json", true) xml.send(null) xml.onreadystatechange function(){if(xml.readyState 4 && xml.status 200){console.log(JSON.parse(xml.responseTe…

AJAX常见面试题,面试必备

什么是AJAX&#xff0c;为什么要使用Ajax AJAX是“Asynchronous JavaScript and XML”的缩写。他是指一种创建交互式网页应用的网页开发技术。、 客户端与服务器&#xff0c;可以在【不必刷新整个浏览器】的情况下&#xff0c;与服务器进行异步通讯的技术 AJAX应用和传统Web…

Ajax和Axios相关面试题总结

文章目录 Ajax和Axios1.同步请求和异步请求2.fetch、axios、jquery的ajax用法3.JS跨域资源共享&#xff08;CORS问题&#xff09;4.Ajax 解决浏览器缓存问题5.ajax 返回的状态6.实现一个 Ajax7.如何实现 ajax 请求&#xff0c;假如我有多个请求&#xff0c;我需要让这些 ajax 请…

面试题 —— Ajax的基本原理总结

前两天面试的时候&#xff0c;面试官问我&#xff0c;你掌握的技能是Ajax&#xff0c;那你给我讲一下它的基本原理吧&#xff01; 妈呀&#xff0c;瞬间脑子空白。当时在门口背了好久的网络知识点&#xff0c;一时竟然说不吃话&#xff0c;只记得什么异步通信&#xff0c;同步数…