电机学习笔记 输出比较

2023-10-29

一、输入比较简介

在这里插入图片描述
输出比较就是通过定时器的外部引脚对外输出控制信号,有冻结、将通道 X(x=1,2,3,4)设置为匹配时输出有效电平、将通道 X 设置为匹配时输出无效电平、翻转、强制变为无效电平、强制变为有效电平、PWM1 和 PWM2 这八种模式,具体使用哪种模式由寄存器 CCMRx 的位 OCxM[2:0]配置。
其中 PWM 模式是输出比较中的特例,使用的也最多

在这里插入图片描述
当计数器 CNT 的值跟比较寄存器 CCR 的值相等的时候,输出参考信号 OCxREF 的信号的极
性就会改变,其中 OCxREF=1(高电平)称之为有效电平,OCxREF=0(低电平)称之为无效
电平,并且会产生比较中断 CCxI,相应的标志位 CCxIF(SR 寄存器中)会置位。然后 OCxREF
再经过一系列的控制之后就成为真正的输出信号 OCx/OCxN。

在这里插入图片描述简单来说就是

CNT的值与CCR1的值相等时,电平就翻转一下

通过不断修改CCR1的值

可以输出四路不同频率,占空比的50%的pwm

配置

在这里插入图片描述

内部时钟源也可以Disable

channel1到4都设置为 output compare ch

psc为167
period 为 0xffff

在这里插入图片描述生成代码后如下

/* TIM8 init function */
void MX_TIM8_Init(void)
{
  TIM_ClockConfigTypeDef sClockSourceConfig = {0};
  TIM_MasterConfigTypeDef sMasterConfig = {0};
  TIM_OC_InitTypeDef sConfigOC = {0};
  TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig = {0};

  htim8.Instance = TIM8;
  htim8.Init.Prescaler = 167;
  htim8.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim8.Init.Period = 0xffff;
  htim8.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  htim8.Init.RepetitionCounter = 0;
  htim8.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  if (HAL_TIM_Base_Init(&htim8) != HAL_OK)
  {
    Error_Handler();
  }
  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
  if (HAL_TIM_ConfigClockSource(&htim8, &sClockSourceConfig) != HAL_OK)
  {
    Error_Handler();
  }
  if (HAL_TIM_OC_Init(&htim8) != HAL_OK)
  {
    Error_Handler();
  }
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  if (HAL_TIMEx_MasterConfigSynchronization(&htim8, &sMasterConfig) != HAL_OK)
  {
    Error_Handler();
  }
  sConfigOC.OCMode = TIM_OCMODE_TOGGLE;  /* PWM模式配置--这里配置为输出比较模式 */
  sConfigOC.Pulse = OC_Pulse_num_Channel1;  /* 比较输出的计数值 */
  sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;  /* 当定时器计数值小于CCR1_Val时为高电平 */
  sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH;  /* 设置互补通道输出的极性 */
  sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;   /* 快速模式设置 */
  sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;  /* 空闲电平 */
  sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET;  /* 互补通道设置 */
  if (HAL_TIM_OC_ConfigChannel(&htim8, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
  {
    Error_Handler();
  }
	sConfigOC.Pulse = OC_Pulse_num_Channel2;
  if (HAL_TIM_OC_ConfigChannel(&htim8, &sConfigOC, TIM_CHANNEL_2) != HAL_OK)
  {
    Error_Handler();
  }
	sConfigOC.Pulse = OC_Pulse_num_Channel3;
  if (HAL_TIM_OC_ConfigChannel(&htim8, &sConfigOC, TIM_CHANNEL_3) != HAL_OK)
  {
    Error_Handler();
  }
	sConfigOC.Pulse = OC_Pulse_num_Channel4;
  if (HAL_TIM_OC_ConfigChannel(&htim8, &sConfigOC, TIM_CHANNEL_4) != HAL_OK)
  {
    Error_Handler();
  }
  sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE;
  sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE;
  sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF;
  sBreakDeadTimeConfig.DeadTime = 0;
  sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE;
  sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH;
  sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE;
  if (HAL_TIMEx_ConfigBreakDeadTime(&htim8, &sBreakDeadTimeConfig) != HAL_OK)
  {
    Error_Handler();
  }
  HAL_TIM_MspPostInit(&htim8);
	
	
}

这里设置每个通道默认的Pulse为

  
__IO uint16_t OC_Pulse_num_Channel1 = 25; /* 通道 1 的比较值 */
__IO uint16_t OC_Pulse_num_Channel2 = 51; /* 通道 2 的比较值 */
__IO uint16_t OC_Pulse_num_Channel3 = 77; /* 通道 3 的比较值 */
__IO uint16_t OC_Pulse_num_Channel4 = 103; /* 通道 4 的比较值 */

到这里我们还需要
启动比较输出并使能中断
使能比较通道

/* 启动比较输出并使能中断 */
HAL_TIM_OC_Start_IT(&htim8,TIM_CHANNEL_1);
HAL_TIM_OC_Start_IT(&htim8,TIM_CHANNEL_2);
HAL_TIM_OC_Start_IT(&htim8,TIM_CHANNEL_3);
HAL_TIM_OC_Start_IT(&htim8,TIM_CHANNEL_4);
/* 使能比较通道 */
TIM_CCxChannelCmd(TIM8,TIM_CHANNEL_1,TIM_CCx_ENABLE);
TIM_CCxChannelCmd(TIM8,TIM_CHANNEL_2,TIM_CCx_ENABLE);
TIM_CCxChannelCmd(TIM8,TIM_CHANNEL_3,TIM_CCx_ENABLE);
TIM_CCxChannelCmd(TIM8,TIM_CHANNEL_4,TIM_CCx_ENABLE);

重写中断回调函数

HAL_TIM_OC_DelayElapsedCallback

void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef *htim) {
	 __IO uint16_t count;
		 /*获取当前计数*/
     count = __HAL_TIM_GET_COUNTER(htim);
		/*判断触发中断的输出通道并设置新的比较数值*/
  if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)
  {
    __HAL_TIM_SET_COMPARE(htim, TIM_CHANNEL_1, count + OC_Pulse_num_Channel1);
  }
  if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)
  {
    __HAL_TIM_SET_COMPARE(htim, TIM_CHANNEL_2, count + OC_Pulse_num_Channel2);
  }
  if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_3)
  {
    __HAL_TIM_SET_COMPARE(htim, TIM_CHANNEL_3, count + OC_Pulse_num_Channel3);
  }
  if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_4)
  {
    __HAL_TIM_SET_COMPARE(htim, TIM_CHANNEL_4, count + OC_Pulse_num_Channel4);
  }
}

CNT的值与CCR1的值相等时,电平就翻转一下,就产生一次中断

在中断中先获取当前计数假设是100
然后是通道1的发生的中断,
100+25 依次加25 当CNT的值与CCR1的值相等时,电平翻转产生中断
这样我们就获的到了一个50%的占空比
25/50 =0.5

因为每一次递增值为25(这里是通道1)所以,一个周期是25+25=50
所以1000000/50 = 20000hz

在这里插入图片描述

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

电机学习笔记 输出比较 的相关文章

  • 51单片机 数码管中断操作

    实践目的 1 掌握中断的概念和思想 2 掌握51单片机中断系统和相关软硬件设计 实践内容 1 利用单片机的P0口接数码管的字段脚 P1 0脚接共阴极 P3 2 P3 3引脚接独立按键产生外部中断信号 编写程序 当程序正常运行时数码管显示H字
  • 在地址“0xXXXXXX”处中断,没有可用的调试信息,或在程序代码之外

    配置 使用 Nucleo L476RG 使用 GNU ARM Eclipse 我从 STM32CubeMX 生成了一个极简代码 我已经在我的板载 ST Link 中刷新了 J link 驱动程序 一直在尝试为我的代码运行调试器 但我的程序计
  • 在 MCU 内部 FLASH 中从一个固件跳转到另一个固件

    我目前正在开发针对 STM32F030C8 的引导加载程序固件应用程序 我在分散文件中指定引导加载程序应用程序将占用主内存位置 0x08000000 到 0x08002FFF 扇区 0 到扇区 2 我还编写了一个主固件应用程序 存储在0x0
  • 如何让printf在STM32F103上工作?

    我是 STM32F103 世界的新手 我有一个STM32F103的演示代码 我正在使用arm none eabi来编译它 我尝试了在谷歌上可以找到的内容 但到目前为止没有任何效果 我已经花了三天时间来解决这个问题 任何人都可以给我一个运行良
  • CMSIS 库是否应该包含在版本控制中? [复制]

    这个问题在这里已经有答案了 通常 我曾经在版本控制中包含芯片供应商 ST 提供的设备特定标头和源以及 CMSIS Core 标头 数量不多 也没有更新的习惯 我使用STM32微控制器 但我不使用立方体框架 or the 标准外设库 最近 我
  • 优化 ARM Cortex M3 代码

    我有一个 C 函数 它尝试将帧缓冲区复制到 FSMC RAM 这些函数将游戏循环的帧速率降低至 10FPS 我想知道如何分析反汇编的函数 我应该计算每个指令周期吗 我想知道CPU把时间花在哪里 在哪个部分 我确信该算法也是一个问题 因为它的
  • rt-thread studio中新建5.02版本报错

    先吐槽一下 rt thread studio出现BUG真多 好多时间都是在找BUG 但里面用好多控件还是挺好用的 真是又爱又恨 所以一般使用功能不多的话还是用keil多一点 创建5 02版本工程之后直接进行编译 直接会报下面这个错误 资源
  • STM32F4 通过软复位跳转到引导加载程序,无需 BOOT0 和 BOOT1 引脚

    我问这个问题是因为可以在这里找到类似问题的答案 通过应用程序跳转到 STM32 中的引导加载程序 即从用户闪存在引导模式下使用引导 0 和引导 1 引脚 用户 JF002 JF002回答 当我想跳转到引导加载程序时 我在其中一个备份寄存器中
  • STM32F103

    提示 来源正点原子 参考STM32F103 战舰开发指南V1 3PDF资料 文章目录 前言 一 pandas是什么 二 使用步骤 1 引入库 2 读入数据 总结 前言 提示 这里可以添加本文要记录的大概内容 开发环境硬件普中科技 接线图在g
  • 解决KEIL编译慢问题

    两种方案 使用v6版本的ARM Compiler 如果v6版本编译不过 必须使用v5版本的 则可以勾选掉Browse Information选项 提升很明显 1分多钟能优化到几秒 看代码量 但是这个有个弊端 在KEIL中会影响函数跳转 建议
  • 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处理 在整个系统运行得过程中 其中大部分时间都是在执行空闲任务的 空闲任务之所以执行 因为在系统中的其他任务处于阻塞或者被挂起时才会执行 因此可以将空闲任务的执行时间转换成低功耗模式 在其他任务解除阻塞而准
  • 嵌入式开发--STM32G4系列片上FLASH的读写

    这个玩意吧 说起来很简单 就是几行代码的事 但楞是折腾了我大半天时间才搞定 原因后面说 先看代码吧 读操作 读操作很简单 以32位方式读取的时候是这样的 data IO uint32 t 0x0800F000 需要注意的是 当以32位方式读
  • STM32 上的位置无关代码 - 指针

    我已成功在 STM32 上构建并运行位置无关的代码 向量表和 GOT 已修补 一切正常 但我对这样的代码有问题 double myAdd double x return x 0 1 double ptrmyAdd double myAdd
  • 在 Contiki 程序中使用 malloc

    考虑以下 Contiki 程序 include
  • STM32F0、ST-link v2、OpenOCD 0.9.0:打开失败

    我在用着发射台 http www ti com ww en launchpad about htmlgcc arm none eabi 4 9 2015q2 为 STM32F0 进行编译 现在我想使用该集合中的 arm none eabi
  • HAL_Delay() 陷入无限循环

    我被 HAL Delay 函数困住了 当我调用此函数 HAL Delay 时 控制陷入无限循环 在寻找问题的过程中 我发现了这个 http www openstm32 org forumthread2145 threadId2146 htt
  • 移动数组中的元素

    我需要一点帮助 我想将数组中的元素向上移动一个元素 以便新位置 1 包含位置 1 中的旧值 new 2 包含 old 1 依此类推 旧的最后一个值被丢弃 第一个位置的新值是我每秒给出的新值 我使用大小为 10 的数组 uint32 t TE
  • STM32 传输结束时,循环 DMA 外设到存储器的行为如何?

    我想问一下 在以下情况下 STM32 中的 DMA SPI rx 会如何表现 我有一个指定的 例如 96 字节数组 名为 A 用于存储从 SPI 接收到的数据 我打开循环 SPI DMA 它对每个字节进行操作 配置为 96 字节 是否有可能

随机推荐

  • 操作系统复习题

    一 填空题 1 通常所说操作系统的四大模块是指处理机管理 存储管理 设备管理 文件 管理 2 进程实体是由 进程控制块 PCB 程序段和数据段这三部分组成 3 文件系统中 空闲存储空间的管理方法有空闲表法 空闲链表法 位示图法和 成组链接法
  • 7_2,24位真彩模式(2013-2-27)

    同理 24位为3通道 3字节 但是经过测试 有问题 不支持24位 7 3 32位真彩模式 32位与16位不同之处 32位分为ARGB和XRGB 各8位 ARGB中前8位为透明色 XRGB前8位为了对齐 一般清为0 define RGB32B
  • JDBC流程

    JDBC JAVA 访问数据库的技术 Jdbc是一种Java连接数据库技术 Java database connectity 它是 Java 提供的一些接口 这些接口大部分是数据库厂商提供的 jar包 我们要做的 是连接数据库以后 如何使用
  • php和nginx镜像合并 && 代码打包到镜像 —— k8s从入门到高并发系列教程 (二)

    上文使用了nginx和php fpm两个镜像组装了nginx php环境 然而实际企业的微服务架构 nginx和php fpm是被统一看作一个微服务供其他服务调用的 另外 配置文件和源代码也不会通过映射到容器中的方式进行 而是打包到了企业的
  • pytorch中dataloader的num_workers参数

    结论速递 在Windows系统中 num workers参数建议设为0 在Linux系统则不需担心 1 问题描述 在之前的任务超大图上的节点表征学习中 使用PyG库用于数据加载的DataLoader ClusterLoader等类时 会涉及
  • [分享]我发现了一个快速完成物联网毕业设计的好方法!

    对于计算机相关专业的毕业生来说 毕业论文真的是一件特别令人头疼的事情 当然学霸除外 毕设 编程 每每想到这里 是不是很想原地爆炸 莫着急往下看 确认过眼神 你就是我要帮助的人 下面就给大家介绍一个快速完成毕业设计的方法 绝对的亲身实践哦 作
  • [极客大挑战 2019]Secret File

    进入靶场查看源码 进入这个网页 5f5574c7 75b8 4251 befa d89a391dafc4 node4 buuoj cn 81 Archive room php 点击这个就会跳入下一个网页 发现没有东西 抓包试试 先返回到这个
  • vite项目集成eslint和prettier

    一 eslint介绍 eslint中文官网 https zh hans eslint org docs latest use getting started 1 什么是eslint ESLint是一个开源的JavaScript代码静态分析工
  • vscode连接远程Linux服务器

    文章目录 一 环境安装 1 1 下载vscode 1 2 下载vscode sever 二 ssh链接 2 1 安装Remote SSH 2 2 设置vscode ssh 2 3 设置免密登录 2 3 1 本地生成公私钥 2 3 2 服务器
  • sharding-jdbc事务解读

    序言 sharding jdbc在分库分表方面提供了很大的便利性 在使用DB的时候 通常都会涉及到事务这个概念 而在分库分表的环境上再加上事务 就会使事情变得复杂起来 本章试图剖析sharding jdbc在事务方面的解决思路 传统事务回顾
  • 二叉查找树,红黑树,AVL树,B~/B+树(B-tree),伸展树——优缺点及比较

    二叉查找树 Binary Search Tree 很显然 二叉查找树的发现完全是因为静态查找结构在动态插入 删除结点所表现出来的无能为力 需要付出极大的代价 BST 的操作代价分析 1 查找代价 任何一个数据的查找过程都需要从根结点出发 沿
  • cpsr寄存器

    设置cpsr寄存器为svc模式 特权模式 CPSR 程序状态寄存器 current program status register cpsr在用户级编程时用于存储条件码 CPSR包含条件码标志 中断禁止位 当前处理器模式以及其他状态和控制信
  • Nvidia container无法修改显示模式问题

    电脑类型 联想拯救者y7000p 2020 问题 当启动游戏时会跳出 Nvidia container 提示的无法 更改显示模式问题 解决办法 退出联想电脑管家
  • 面试题:内存泄漏以及避免和减少这类错误的方法?

    面试题 内存泄漏以及避免和减少这类错误的方法 在C 程序中 内存泄漏是一种常见的错误 它指的是在程序中使用new操作符为对象分配内存后 未对其进行及时释放导致的内存浪费 如果内存泄漏问题得不到解决 会导致程序运行速度变慢 稳定性降低甚至崩溃
  • Android动画内幕揭秘

    原文链接 Android Animation Internal Secrets 前面的文章重点讲了如何使用安卓平台提供的能力来做好一个动画 为了更深入的理解 需要去了解一下动画框架的内部机理 这样能够帮助我们做出更优雅的动画实现 View
  • HTML文件路径

    目录 HTML 文件路径 绝对文件路径 实例 相对路径 实例 实例 实例 好习惯 路径 描述 img src picture jpg picture jpg 位于与当前网页相同的文件夹 img src images picture jpg
  • Panoptic SegFormer:全景分割第一名!南大&港大&英伟达提出新算法,霸榜全景分割

    轻量级全景分割 模型50多m 有预测代码 没有训练 GitHub midasklr PPLiteSeg pytorch pytorch of the SOTA real time segmentation network ppliteseg
  • ubuntu/WSL 2.0 解决无法通过apt安装jdk的问题

    WSL 2 0 下无法通过apt安装jdk问题解决 问题描述 解决方法 总结 问题描述 在win11的wsl下通过apt安装jdk包时遇到了下列问题 执行这个安装命令 sudo apt get install openjdk 8 jdk 结
  • 大厂都在做的jmeter接口自动化测试登峰造极的jmeter实现接口自动化测试

    一 JMETER的环境搭建 参考 https www cnblogs com qmfsun p 4902534 html 二 JMETER的汉化 临时汉化方法 打开jmeter options gt choose language gt 选
  • 电机学习笔记 输出比较

    一 输入比较简介 输出比较就是通过定时器的外部引脚对外输出控制信号 有冻结 将通道 X x 1 2 3 4 设置为匹配时输出有效电平 将通道 X 设置为匹配时输出无效电平 翻转 强制变为无效电平 强制变为有效电平 PWM1 和 PWM2 这