技术标签: STM32C011 STM32CUBEMX stm32cube 步进电机 定时器 STSPIN220 中断 #STM32 单片机 细分
在步进电机控制过程中,为了实现精确的位置和速度控制,经常需要输出指定数量的脉冲。这就需要使用定时器功能来生成PWM脉冲信号。本文将详细介绍如何利用STM32CUBEMX配置定时器以输出指定数量的PWM脉冲。
定时器是STM32微控制器的一个重要功能模块,可用于生成各种定时和计数操作。通过合理配置定时器的参数和模式,我们可以实现精确的脉冲输出。
最近在弄ST的课程,需要样片的可以加群申请:615061293 。
https://www.wjx.top/vm/PpC1kRR.aspx
https://www.bilibili.com/video/BV1k94y1C7Gw/
基于STM32CUBEMX驱动低压步进器电机驱动器STSPIN220(2)----定时器中断产生指定数量脉冲
https://download.csdn.net/download/qq_24312945/88184732
一种比较简单的方式是利用定时器中断来产生固定数量的脉冲。在这种方法中,我们可以将定时器配置为PWM输出模式,并在PWM输出的中断中进行计数操作。当计数达到设定的脉冲个数后,我们可以停止PWM输出,从而实现精确控制。下面以定时器1的通道4为例,介绍具体的步骤:
在STM32CUBEMX中,选择定时器1,并将其配置为PWM输出模式。确保选择了正确的定时器通道(通道4)。
配置定时器1的时钟源和预分频因子。根据应用的要求和系统时钟频率,选择适当的时钟源和预分频因子,以获得所需的脉冲频率。将定时器1的时钟源和预分频因子配置为适合您的应用的值。
PWM频率计算如下所示。
在上述配置中,将定时器1的预分频系数设置为48-1,自动重载值设置为1000-1。根据这些配置,PWM的频率可以计算为48,000,000 / ((48-1+1) * (1000-1+1)) = 1000Hz,即1kHz。
在定时器中,通道的 “pulse”(脉冲)是指定时器输出的信号的一种特性。每个定时器通道都可用于生成脉冲信号,而 “pulse” 通常指的是单个脉冲的持续时间。在这种设置中,我们将脉冲的占空比配置为50%,因此设置为500-1。
当PWM脉冲完成时,我们需要触发一个回调函数。HAL_TIM_PWM_PulseFinishedCallback函数是用于在非阻塞模式下处理PWM脉冲完成的回调函数。
为了触发HAL_TIM_PWM_PulseFinishedCallback回调函数,需要启用Capture Compare Interrupt中断。
首先,可以定义一个全局变量,该变量用于控制输出脉冲的个数。通过操作该变量,我们可以在程序中灵活地控制所需的脉冲数量。
/* USER CODE BEGIN 0 */
void MX_GPIO_Init_mode3(void);
uint16_t STSPIN220_PwmNum;
uint8_t STSPIN220_flag=0;//电机完成步数标志位
uint8_t STSPIN220_Dir_flag=0;//方向
/* USER CODE END 0 */
首先,使用MX_TIM1_Init()初始化定时器1。
接下来,当需要输出脉冲时,将所需的脉冲数量赋值给变量STSPIN220_PwmNum。
最后,使用HAL_TIM_PWM_Start_IT(&htim1, TIM_CHANNEL_4)启动定时器1的PWM中断输出。
STSPIN220_PwmNum = 20;
MX_TIM1_Init();
HAL_TIM_PWM_Start_IT(&htim1,TIM_CHANNEL_4);
HAL_TIM_PWM_PulseFinishedCallback回调函数的实现部分。
在函数内部,如果STSPIN220_PwmNum的值为0,即已经输出了所需的脉冲个数,那么通过调HAL_TIM_PWM_Stop_IT(&htim1, TIM_CHANNEL_4)停止定时器1的PWM中断输出,以达到停止脉冲输出的目的。
其次对全局变量STSPIN220_PwmNum进行递减操作,表示完成了一个脉冲的输出就进行减1。接着,通过条件判断if (STSPIN220_PwmNum == 0),检查是否已经输出了指定数量的脉冲。
这段代码的作用是在每次PWM波形周期完成时,更新全局变量STSPIN220_PwmNum的值,并在达到指定的脉冲数量后停止PWM中断输出。通过这种方式,可以实现精确控制输出脉冲个数的功能。
/* USER CODE BEGIN 4 */
void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim)
{
if(STSPIN220_PwmNum==0)
{
HAL_TIM_PWM_Stop_IT(&htim1,TIM_CHANNEL_4);
STSPIN220_flag=1;//电机完成步数标志位
}
STSPIN220_PwmNum--;
}
/* USER CODE END 4 */
产生波形如下所示,可以看到有20个脉冲。
这里使用的电机为步进角为18°,1:30的减速比,在这种情况下,如果步进电机的步进角为18°,减速比为1:30,那么旋转一周所需的脉冲数量可以计算为:
旋转一周所需脉冲 = (360 / 步进角) * 减速比 * 细分数
其中,步进角以度为单位,减速比是相对于电机输出轴和实际应用中的旋转轴之间的比率,细分数表示步进电机驱动器将一个步进角分割成多少个微步。
根据这个公式来计算出所需的脉冲数量,从而实现旋转一周的控制。
STSPIN220修改后初始化如下所示。
/* USER CODE BEGIN 2 */
MX_GPIO_Init_mode3();
HAL_Delay(100);
STSPIN220_SetStepMode(0);//mode1-mode4都关闭
STSPIN220_enable(0);//使能操作 1使能0失能
STSPIN220_Stby(1);//低功耗模式 1开启低功耗0关闭低功耗
HAL_Delay(100);
STSPIN220_SetStepMode(2);//细分操作
STSPIN220_Stby(0);//低功耗模式 1开启低功耗0关闭低功耗,加载mode
HAL_Delay(100);//等待电平稳定
STSPIN220_setDirection(0);//0反1正
HAL_Delay(100);//等待电平稳定
STSPIN220_enable(1);//使能操作 1使能0失能
HAL_Delay(100);
STSPIN220_PwmNum = 600*2;//步进角为18°,1:30的减速比,细分2则需要走(360/18)*30*2为一圈
MX_TIM1_Init();
// HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_4);
HAL_TIM_PWM_Start_IT(&htim1,TIM_CHANNEL_4);
/* USER CODE END 2 */
实现电机循环正转1圈反转1圈代码如下所示。
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
if(STSPIN220_flag)
{
HAL_Delay(1000);
// STSPIN220_Stby(1);//低功耗模式 1开启低功耗0关闭低功耗
STSPIN220_flag=0;
if(STSPIN220_Dir_flag==0)
{
STSPIN220_Dir_flag=1;
STSPIN220_setDirection(1);//0反1正
HAL_Delay(100);
STSPIN220_PwmNum = 600*2;//步进角为18°,1:30的减速比,细分2则需要走(360/18)*30*2为一圈
HAL_TIM_PWM_Start_IT(&htim1,TIM_CHANNEL_4);
}
else
{
STSPIN220_Dir_flag=0;
STSPIN220_setDirection(0);//0反1正
HAL_Delay(100);
STSPIN220_PwmNum = 600*2;//步进角为18°,1:30的减速比,细分2则需要走(360/18)*30*2为一圈
HAL_TIM_PWM_Start_IT(&htim1,TIM_CHANNEL_4);
}
}
HAL_Delay(10);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
文章浏览阅读2w次,点赞7次,收藏51次。四个步骤1.创建C++ Win32项目动态库dll 2.在Win32项目动态库中添加 外部依赖项 lib头文件和lib库3.导出C接口4.c#调用c++动态库开始你的表演...①创建一个空白的解决方案,在解决方案中添加 Visual C++ , Win32 项目空白解决方案的创建:添加Visual C++ , Win32 项目这......_c#调用lib
文章浏览阅读4.6k次。苹方字体是苹果系统上的黑体,挺好看的。注重颜值的网站都会使用,例如知乎:font-family: -apple-system, BlinkMacSystemFont, Helvetica Neue, PingFang SC, Microsoft YaHei, Source Han Sans SC, Noto Sans CJK SC, W..._ubuntu pingfang
文章浏览阅读159次。表单表单概述表单标签表单域按钮控件demo表单标签表单标签基本语法结构<form action="处理数据程序的url地址“ method=”get|post“ name="表单名称”></form><!--action,当提交表单时,向何处发送表单中的数据,地址可以是相对地址也可以是绝对地址--><!--method将表单中的数据传送给服务器处理,get方式直接显示在url地址中,数据可以被缓存,且长度有限制;而post方式数据隐藏传输,_html表单的处理程序有那些
文章浏览阅读1.2k次。使用说明:开启Google的登陆二步验证(即Google Authenticator服务)后用户登陆时需要输入额外由手机客户端生成的一次性密码。实现Google Authenticator功能需要服务器端和客户端的支持。服务器端负责密钥的生成、验证一次性密码是否正确。客户端记录密钥后生成一次性密码。下载谷歌验证类库文件放到项目合适位置(我这边放在项目Vender下面)https://github.com/PHPGangsta/GoogleAuthenticatorPHP代码示例://引入谷_php otp 验证器
文章浏览阅读4.3k次,点赞5次,收藏11次。matplotlib.plot画图横坐标混乱及间隔处理_matplotlib更改横轴间距
文章浏览阅读2.2k次。①Storage driver 处理各镜像层及容器层的处理细节,实现了多层数据的堆叠,为用户 提供了多层数据合并后的统一视图②所有 Storage driver 都使用可堆叠图像层和写时复制(CoW)策略③docker info 命令可查看当系统上的 storage driver主要用于测试目的,不建议用于生成环境。_docker 保存容器
文章浏览阅读834次,点赞27次,收藏13次。网络拓扑结构是指计算机网络中各组件(如计算机、服务器、打印机、路由器、交换机等设备)及其连接线路在物理布局或逻辑构型上的排列形式。这种布局不仅描述了设备间的实际物理连接方式,也决定了数据在网络中流动的路径和方式。不同的网络拓扑结构影响着网络的性能、可靠性、可扩展性及管理维护的难易程度。_网络拓扑csdn
文章浏览阅读1.8k次,点赞5次,收藏8次。IOS系统Date的坑要创建一个指定时间的new Date对象时,通常的做法是:new Date("2020-09-21 11:11:00")这行代码在 PC 端和安卓端都是正常的,而在 iOS 端则会提示 Invalid Date 无效日期。在IOS年月日中间的横岗许换成斜杠,也就是new Date("2020/09/21 11:11:00")通常为了兼容IOS的这个坑,需要做一些额外的特殊处理,笔者在开发的时候经常会忘了兼容IOS系统。所以就想试着重写Date函数,一劳永逸,避免每次ne_date.prototype 将所有 ios
文章浏览阅读5.3k次。方法一:用PLSQL Developer工具。 1 在PLSQL Developer的sql window里输入select * from test for update; 2 按F8执行 3 打开锁, 再按一下加号. 鼠标点到第一列的列头,使全列成选中状态,然后粘贴,最后commit提交即可。(前提..._excel导入pl/sql
文章浏览阅读83次。Git常用命令速查手册1、初始化仓库git init2、将文件添加到仓库git add 文件名 # 将工作区的某个文件添加到暂存区 git add -u # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,不处理untracked的文件git add -A # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,包括untracked的文件...
文章浏览阅读202次。分享119个ASP.NET源码总有一个是你想要的_千博二手车源码v2023 build 1120
文章浏览阅读1.8k次。版权声明:转载请注明出处 http://blog.csdn.net/irean_lau。目录(?)[+]1、缺省构造函数。2、缺省拷贝构造函数。3、 缺省析构函数。4、缺省赋值运算符。5、缺省取址运算符。6、 缺省取址运算符 const。[cpp] view plain copy_空类默认产生哪些类成员函数