STM32 基础知识(探索者开发板)--93讲 PWM

news2025/1/18 11:58:47

预分频器相当于一个计数器,2分频就是接收2个脉冲传递一个脉冲,3分频就是接收3个脉冲传递一个脉冲,最高65535分频,那么总计时间能达到65535*65535*1/72MHZ 约59秒,没有分频器只能计数最高0.09秒

PWM配置步骤

1.配置定时器基础工作参数                       HAL_TIM_PWM_Init(TIM_HandleTypeDef *htim)

2.定时器PWM输出Msp初始化                   HAL_TIM_PWM_MspInit()

3.配置PWM模式/比较值等                         HAL_TIM_PWM_ConfigChannel()

4.使能输出并启动计数器                            HAL_TIM_PWM_Start()

5.修改比较值控制占空比                            __HAL_TIM_SET_COMPARE()

解释步骤1中TIM_HandleTypeDef

typedef struct
{
 TIM_TypeDef *Instance; /* 外设寄存器基地址 */
 TIM_Base_InitTypeDef Init; /* 定时器初始化结构体*/
}TIM_HandleTypeDef;

再解释其中Init

typedef struct
{
 uint32_t Prescaler; /* 预分频系数 */ 
 uint32_t CounterMode; /* 计数模式 */
 uint32_t Period; /* 自动重载值 ARR */
 uint32_t ClockDivision; /* 时钟分频因子 */ 
 uint32_t RepetitionCounter; /* 重复计数器 */
 uint32_t AutoReloadPreload; /* 自动重载预装载使能 */
} TIM_Base_InitTypeDef;

解释步骤3中

HAL_StatusTypeDef HAL_TIM_PWM_ConfigChannel(TIM_HandleTypeDef *htim,
TIM_OC_InitTypeDef *sConfig, uint32_t Channel)的 TIM_OC_InitTypeDef 结构体

typedef struct
{
 uint32_t OCMode; /* 输出比较模式选择,寄存器的时候说过了,共 8 种模式 */
 uint32_t Pulse; /* 设置比较值 */
 uint32_t OCPolarity; /* 设置输出比较极性 */
 uint32_t OCNPolarity; /* 设置互补输出比较极性 */
 uint32_t OCFastMode; /* 使能或失能输出比较快速模式 */
 uint32_t OCIdleState; /* 选择空闲状态下的非工作状态(OC1 输出) */
 uint32_t OCNIdleState; /* 设置空闲状态下的非工作状态(OC1N 输出) */
} TIM_OC_InitTypeDef

PWM控制呼吸灯实验

gtim代码

//gtim.c

#include "./BSP/TIMER/gtim.h"



TIM_HandleTypeDef g_timx_pwm_chy_handle;

// 通用定时器PWM输出初初始化函数
void gitm_timx_pwm_chy_init(uint16_t arr,uint16_t psc)      //1.配置定时器基础工作参数
{
    TIM_OC_InitTypeDef timx_oc_pwm_chy = {0x00};            //定时器输出句柄
    
    g_timx_pwm_chy_handle.Instance = TIM14;
    g_timx_pwm_chy_handle.Init.Prescaler = psc;             //自动重装载值
    g_timx_pwm_chy_handle.Init.Period = arr;                //预分频系数
    g_timx_pwm_chy_handle.Init.CounterMode = TIM_COUNTERMODE_UP;
    HAL_TIM_PWM_Init(&g_timx_pwm_chy_handle);               //初始化PWM
    
    
    timx_oc_pwm_chy.OCMode = TIM_OCMODE_PWM1;               //选择PWM模式1
    timx_oc_pwm_chy.Pulse = arr / 2;                     //设置占空比,百分之五十
    timx_oc_pwm_chy.OCPolarity = TIM_OCPOLARITY_LOW;     //设置输出极性为低
    HAL_TIM_PWM_ConfigChannel(&g_timx_pwm_chy_handle,&timx_oc_pwm_chy,TIM_CHANNEL_1);  //3.配置PWM模式/比较值
    
    HAL_TIM_PWM_Start(&g_timx_pwm_chy_handle,TIM_CHANNEL_1);    //4.使能输出计数器
}


//定时器输出PWM MSP初始化函数
void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim)                     //配置GPIO
{
    if (htim->Instance == TIM14)
    {
        GPIO_InitTypeDef gpio_init_struct;
        __HAL_RCC_GPIOF_CLK_ENABLE();                                /* 开启通道y的CPIO时钟 */
        __HAL_RCC_TIM14_CLK_ENABLE();                                     /* 使能定时器时钟 */
    
        gpio_init_struct.Pin = GPIO_PIN_9;                              /* 通道y的CPIO口 */
        gpio_init_struct.Mode = GPIO_MODE_AF_PP;                        /* 复用推挽输出 */
        gpio_init_struct.Pull = GPIO_PULLUP;                            /* 上拉 */
        gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH;                  /* 高速 */
        gpio_init_struct.Alternate = GPIO_AF9_TIM14;                    /* IO复用设置 */
        HAL_GPIO_Init(GPIOF, &gpio_init_struct);
    }
}



//gtim.h

#ifndef __GTIM_H
#define __GTIM_H

#include "./SYSTEM/sys/sys.h"


void gitm_timx_pwm_chy_init(uint16_t arr,uint16_t psc);
void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim);


#endif

main.c

#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/usart/usart.h"
#include "./SYSTEM/delay/delay.h"
#include "./BSP/LED/led.h"
#include "./BSP/TIMER/gtim.h"


extern TIM_HandleTypeDef g_timx_pwm_chy_handle; //引入结构体
int main(void)
{
    uint16_t ledrpwmval = 0;
    uint8_t dir = 1;
    
    HAL_Init();                                 /* 初始化HAL库 */
    sys_stm32_clock_init(336, 8, 2, 7);         /* 设置时钟,168Mhz */
    delay_init(168);                            /* 延时初始化 */
    usart_init(115200);                         /* 串口初始化为115200 */
    led_init();                                 /* 初始化LED */
    gitm_timx_pwm_chy_init(500 - 1, 84 - 1);    /* 84 000 000 / 84 = 1 000 000 1Mhz的计数频率,2Khz的PWM */
    
    while (1)
    {
        delay_ms(10);

        if (dir)ledrpwmval++;                   /* dir==1 ledrpwmval递增 */
        else ledrpwmval--;                      /* dir==0 ledrpwmval递减 */

        if (ledrpwmval > 100)dir = 0;           /* ledrpwmval到达300后,方向为递减 */
        if (ledrpwmval == 0)dir = 1;            /* ledrpwmval递减到0后,方向改为递增 */

        /* 修改比较值控制占空比 */
        __HAL_TIM_SET_COMPARE(&g_timx_pwm_chy_handle, TIM_CHANNEL_1, ledrpwmval);
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1340239.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据分析工具 Top 8

你能想象一个没有工具箱的水管工吗? 没有,对吧? 数据从业者也是如此。如果没有他们的数据分析工具,数据从业者就无法分析数据、可视化数据、从数据中提取价值,也无法做数据从业者在日常工作中做的许多很酷的事情。 根据你最感兴趣的数据科学职业——数…

企业数据可视化-亿发数据化管理平台提供商,实现一站式数字化运营

近些年来,国内企业数据化管理升级进程持续加速,以物联网建设、人工智能、大数据和5G网络等新技术的发展,推动了数字经济的蓬勃发展,成为维持经济持续稳定增长的重要引擎。如今许多国内中小型企业纷纷摒弃传统管理模式,…

ThinkPHP6.0任意文件上传 PHPSESSION 已亲自复现

ThinkPHP6.0任意文件上传 PHPSESSION 已亲自复现 漏洞名称漏洞描述影响版本 漏洞复现环境搭建安装thinkphp6漏洞信息配置 漏洞利用 修复建议 漏洞名称 漏洞描述 2020年1月10日,ThinkPHP团队发布一个补丁更新,修复了一处由不安全的SessionId导致的任意文…

读取无标题列表txt文本文件

文件如下: 使用pandas直接读取,有多少条数据,就会读出来多少列: import pandas as pdfilepath/Users/。。。/ file1失败名单.txt df1pd.read_csv(filepathfile1,sep,,headerNone) 会打印出无数列数据: 使用open方法读…

Linux基础知识点(四-管道)

目录 一、管道的基本概念 二、管道的分类 2.1 匿名管道PIPE 2.2 命名管道FIFO 三、pipe()函数 3.1 pipe()函数介绍 3.2 pipe()函数的使用 四、fifo()函数 4.1 fifo()函数介绍 4.2 命名管道创建方式 五、管道读写特点 一、管道的基本概念 生活中的管道&#xff0c…

【map】【滑动窗口】【优先队列】LeetCode480滑动窗口中位数

作者推荐 动态规划 多源路径 字典树 LeetCode2977:转换字符串的最小成本 本题涉及知识点 滑动窗口 map 优先队列 题目 中位数是有序序列最中间的那个数。如果序列的长度是偶数,则没有最中间的数;此时中位数是最中间的两个数的平均数。 例如&#xf…

springBoot整合redis做缓存

一、Redis介绍 Redis是当前比较热门的NOSQL系统之一,它是一个开源的使用ANSI c语言编写的key-value存储系统(区别于MySQL的二维表格的形式存储。)。和Memcache类似,但很大程度补偿了Memcache的不足。和Memcache一样,R…

yolov8 细胞分割数据集准备及训练

1、数据 下载:https://universe.roboflow.com/motherson-hm/5-part-diff 500来张,5个类别(嗜碱性细胞、嗜酸细胞、淋巴细胞、单核细胞、中性粒细胞) yolo 分割数据标注格式: 与检测类似,就是坐标分割有多个 2、训练 训练yaml: seg_data.yaml (与检测格式一样) …

sheng的学习笔记-卷积神经网络

源自吴恩达的深度学习课程,仅用于笔记,便于自行复习 导论 1)什么是卷积神经网络 卷积神经网络,也就是convolutional neural networks (简称CNN),使用卷积算法的神经网络,常用于计…

四川云汇优想教育咨询有限公司抖店开店靠谱吗

随着短视频平台的崛起,抖音已经成为了越来越多人展示自我、分享生活、推广产品的重要平台。因此,开设抖店已经成为了很多人的创业选择。如果您也有兴趣开设抖店,那么四川云汇优想教育咨询有限公司抖店开店服务将是您的不二之选。 四川云汇优想…

推荐五款简洁而实用的工具,值得你尝试

​ 分享快乐是生活中美好的瞬间,而分享简单巧妙的工具也能令我愉悦。这五款工具简洁而实用,值得你尝试。 1.视频播放器——Potplayer Potplayer是一款视频播放器,支持DXVA、CUDA和QuickSync等硬件加速技术,提供高效的视频播放性…

【数据结构和算法】---二叉树(2)--堆的实现和应用

目录 一、堆的概念及结构二、堆结构的实现2.1堆向下调整算法2.2堆向上调整算法2.3删除堆顶元素2.4插入元素2.5其他函数接口 三、堆结构的应用3.1堆排序3.2Top-k问题 四、堆概念及结构相关题目 一、堆的概念及结构 如果有一个数字集合,并把它的所有元素按完全二叉树…

2022 年全国职业院校技能大赛高职组云计算正式赛卷第二场-容器云

2022 年全国职业院校技能大赛高职组云计算赛项试卷 云计算赛项第二场-容器云 目录 2022 年全国职业院校技能大赛高职组云计算赛项试卷 【赛程名称】云计算赛项第二场-容器云 【任务 1】容器云平台搭建[5 分] 【任务 2】容器云应用部署: Docker Compose 编排部署[7.0…

文件操作安全之-目录穿越流量告警运营分析篇

本文从目录穿越的定义,目录穿越的多种编码流量数据包示例,目录穿越的suricata规则,目录穿越的告警分析研判,目录穿越的处置建议等几个方面阐述如何通过IDS/NDR,态势感知等流量平台的目录穿越类型的告警的线索,开展日常安全运营工作,从而挖掘有意义的安全事件。 目录穿越…

二分查找——OJ题(一)

📘北尘_:个人主页 🌎个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上,不忘来时的初心 文章目录 一、二分查找1、题目讲解2、算法原理3、代码实现 二、在排序数组中查找元素的第一个和最后一个…

Frappe Charts:数据可视化的强大工具

一、产品简介: 一个简单、零依赖、响应式的 开源SVG 图表库。这个图表库无论是数据更新还是屏幕大小变化,都能快速响应并更新图表。数据生成和悬停查看都有舒服的交互动效,体验感很好。不仅支持配置颜色,外观定制也很方便。还支持…

Python 常用模块Logging

Python 常用模块Logging 【序言】 logging模块是专门用来做日志记录的模块 【一】日志等级 默认打印结果到终端上 CRITICAL 50 # 致命错误 ERROR 40 # 错误 WARNING 30 # 警告 INFO 20 # 消息 DEBUG 10 # 调试 NOTSET 0 # 不设置示例: 默认级别为…

Vue3+ElementPlus: 给点击按钮添加触发提示

一、需求 在Vue3项目中,有一个下载按钮,当鼠标悬浮在按钮上面时,会出现文字提示用户可以点击按钮进行数据的下载技术栈 Vue3 ElementPlusTooltip组件 ElementPlus中的Tooltip组件 ,可用于展示鼠标 hover 时的提示信息 二、实现…

jenkins解决工具找不到的问题

--------------------------插件选择版本最好能跟服务器对上

EDM打开率突然下降的原因:深入分析并采取应对措施

在跨境电商和出海领域,电子邮件营销(Email Marketing)已成为企业营销推广及与客户互动的主要手段之一,在企业营销中起到主导地位。但是,有时我们不得不面对EDM打开率突然下降的困境。那么,EDM打开率下降的原…