ARM32开发--PWM与通用定时器

知不足而奋进·望远山而前行


目录

文章目录

前言

学习目标

学习内容

PWM

pwm原理

需求

开发流程

初始化PWM

PWM占空比控制

main函数修改duty

输出通道

关心的内容

重要的关键词

周期

分频

占空比

总结


前言

在微控制器开发中,理解和掌握PWM(脉宽调制)技术以及与定时器的关系是至关重要的。PWM技术可以广泛应用于工业自动化、电机控制、LED调光等领域,通过改变信号的脉冲宽度来控制电路输出。本文将介绍PWM原理、开发流程,以及如何通过定时器实现PWM功能。通过学习本文,您将掌握通用定时器开发流程,理解周期、分频系数、周期计数、分频计数等概念,以及掌握分频计数、周期计数和占空比的计算策略。


学习目标

  1. 理解PWM和定时器的关系
  2. 掌握通用定时器开发流程
  3. 理解周期,分频系数,周期计数,分频计数。
  4. 掌握分频计数、周期计数和占空比的计算策略

学习内容

PWM

PWM全称是脉宽调制(Pulse Width Modulation),是一种通过改变信号的脉冲宽度来控制电路输出的技术。PWM技术在工业自动化、电机控制、LED调光等领域广泛应用。

PWM是一种将数字信号转换为模拟信号的技术,它通过改变信号的占空比来控制输出的电平。

在ARM32系列芯片中,PWM输出的频率和占空比可以由程序控制,因此可以用来控制各种电机、灯光和其他设备的亮度、速度等参。

在ARM32系列芯片中,PWM的调制是通过Timer来实现的。PWM与引脚相关,除了基本定时器以外,其他类型的Timer都可以作为PWM来进行使用。

pwm原理

CHxCV是输入捕获和输出比较寄存器

需求

PD14对应的LED4为例,我们做一个呼吸灯的效果。

我们采用TIMER3CH2进行实现:

开发流程

  1. 添加Timer依赖
  2. 初始化PWM
  3. PWM占空比控制
初始化PWM

#define	PRESCALER	10		    // [1, 65536]
#define	FREQ		1000		// 1000Hz

// 保证分母 (FREQ * PRESCALER) >= 2564
#define PERIOD 				SystemCoreClock / (FREQ * PRESCALER)

// TIMER3_CH2
static void Timer_config() {
    // 通用定时器

    // GPIO PD14 =================================================================
    rcu_periph_clock_enable(RCU_GPIOD);
    gpio_mode_set(GPIOD, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_14);
    gpio_output_options_set(GPIOD, GPIO_OTYPE_PP, GPIO_OSPEED_MAX, GPIO_PIN_14);
    gpio_af_set(GPIOD, GPIO_AF_2, GPIO_PIN_14);

    // TIMER3C0 =================================================================
    // 初始化定时器配置
    rcu_periph_clock_enable(RCU_PERIPH);

    timer_deinit(TIMER_PERIPH);
    // 升级频率
    rcu_timer_clock_prescaler_config(RCU_TIMER_PSC_MUL4);
    // 初始化参数
    timer_parameter_struct initpara;
    /* initialize TIMER init parameter struct */
    timer_struct_para_init(&initpara);
    /* 根据需要配置值 */
    initpara.prescaler = PRESCALER - 1;	// 分频系数 (可以实现更低的timer频率)
    // 1个周期的计数(period Max: 65535) Freq > 2564
    initpara.period		 = PERIOD - 1;
    /* initialize TIMER counter */
    timer_init(TIMER_PERIPH, &initpara);

    // TIMER通道输出配置
    timer_oc_parameter_struct ocpara;
    /* 初始化结构体参数 initialize TIMER channel output parameter struct */
    timer_channel_output_struct_para_init(&ocpara);
    /* 启用TM1 CH0的OP极(正极) */
    ocpara.outputstate  = (uint16_t)TIMER_CCX_ENABLE;
    /* 配置输出参数configure TIMER channel output function */
    timer_channel_output_config(TIMER_PERIPH, TIMER_CH, &ocpara);
    /* 配置通达输出比较模式 configure TIMER channel output compare mode */
    timer_channel_output_mode_config(TIMER_PERIPH, TIMER_CH, TIMER_OC_MODE_PWM0);
    /* 设置通道输出脉冲值 (修改占空比) configure TIMER channel output pulse value */
    timer_channel_output_pulse_value_config(TIMER_PERIPH, TIMER_CH, (PERIOD - 1) * 1.0f);

    /* enable a TIMER */
    timer_enable(TIMER_PERIPH);
}
PWM占空比控制
void PWM_update(float duty) { // 0 -> 100

    if(duty > 100) {
        duty = 100;
    } else if (duty < 0) {
        duty = 0;
    }
    // pulse / (PERIOD - 1) == duty / 100;
    uint32_t pulse = (PERIOD - 1) * duty / 100.0f;
    /* 设置通道输出脉冲值 (修改占空比) configure TIMER channel output pulse value */
    timer_channel_output_pulse_value_config(TIMER_PERIPH, TIMER_CH, pulse);

}
main函数修改duty
int main(void)
{
    nvic_priority_group_set(NVIC_PRIGROUP_PRE2_SUB2);
    systick_config();
    USART0_init();

    Timer_config();
    printf("Init Complete!\n");

    PWM_update(0);

    float duty = 0;
    int dir = 1;
    while(1) {

        // printf发送字符串
        // 0 -> (PERIOD - 1) -> 0 -> ....

        if(duty >= 100) {
            dir = -1;
        } else if(duty <= 0) {
            dir = 1;
        }

        duty += dir;

        PWM_update(duty);

        delay_1ms(10);
    }
}

输出通道

这里完整配置为多种:

void timer_channel_output_struct_para_init(timer_oc_parameter_struct *ocpara)
{
    /* initialize the channel output parameter struct member with the default value */
    ocpara->outputstate  = (uint16_t)TIMER_CCX_DISABLE;
    ocpara->outputnstate = TIMER_CCXN_DISABLE;
    ocpara->ocpolarity   = TIMER_OC_POLARITY_HIGH;
    ocpara->ocnpolarity  = TIMER_OCN_POLARITY_HIGH;
    ocpara->ocidlestate  = TIMER_OC_IDLE_STATE_LOW;
    ocpara->ocnidlestate = TIMER_OCN_IDLE_STATE_LOW;
}

我们具体的可以分为两类:

ocpara->outputstate  = (uint16_t)TIMER_CCX_DISABLE;
ocpara->ocpolarity   = TIMER_OC_POLARITY_HIGH;
ocpara->ocidlestate  = TIMER_OC_IDLE_STATE_LOW;
ocpara->outputnstate = TIMER_CCXN_DISABLE;
ocpara->ocnpolarity  = TIMER_OCN_POLARITY_HIGH;
ocpara->ocnidlestate = TIMER_OCN_IDLE_STATE_LOW;

特别观察API,带N的为反向,带P的为正向。赋值的结果常量也是需要注意是否带N。

P和N的配置主要出现在互补PWM中,如果当前的Timer不是高级定时器,那么就不具备互补的功能,那么我们一律认为他是P类型,也就是设置P才有用。

通过设置outputstate 的 ENABLE来控制输出通道的开启。

关心的内容

  • 哪个定时器
  • 哪个引脚输出pwm
  • 周期和分频系数

重要的关键词

周期

pwm中,一个周期就是一次高低电平的变化。

分频

将原来的活增加几倍时间干完。

占空比

1个周期内,高电平出现的比例。


总结

本文详细介绍了PWM技术以及与定时器的关系,通过示例代码演示了在ARM32系列芯片中如何实现PWM功能。首先,我们了解了PWM技术是如何将数字信号转换为模拟信号,并通过改变占空比来控制输出电平的。接着,我们学习了开发流程,包括如何初始化PWM以及如何控制PWM占空比。最后,我们通过具体的代码示例演示了如何在实际开发中应用PWM技术,实现呼吸灯效果。通过本文的学习,相信您已经掌握了有关PWM和定时器的基本知识和开发技巧,希望本文能够对您的学习和开发有所帮助。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

美团强势领涨恒指,港股即将迎来触底反弹?

恒指早间低开低走&#xff0c;持续低位徘徊&#xff0c;一度试探万八关口&#xff0c;最低见17994点&#xff0c;市场情绪表现疲弱&#xff0c;大型科技股普遍走低&#xff0c;但主要指数午后回升&#xff0c;恒生科技指数率先转涨&#xff0c;美团(3690.HK)涨超4%领涨成分股&a…

流程与IT双驱动:锐捷网络如何构建持续领先的服务竞争力?

AI大模型及相关应用进入“竞赛时代”&#xff0c;算力作为关键要素备受关注&#xff0c;由于算力行业对网络设备和性能有较大需求&#xff0c;其发展也在推动ICT解决方案提供商加速升级&#xff0c;提升服务响应速度和服务质量。 锐捷网络是行业领先的ICT基础设施及行业解决方…

[CAN] DBC数据库编辑器的下载与安装

DBC数据库编辑器 1 概述2 下载与安装2.1 下载2.2 安装 1 概述 VectorCANdb是一款专为CAN&#xff08;Controller Area Network&#xff09;通信设计的数据管理工具。这款软件为工程师们提供了一个全面、高效的平台&#xff0c;用于定义、修改和管理与CAN网络相关的数据&#xf…

rospkg.os_detect.OsNotDetected检测不到系统的解决办法

遇到上述报错时&#xff0c;可以参考博客进行解决

易舟云:让中小企业财务管理变得触手可及

在现代企业运营中&#xff0c;财务管理的精准和高效至关重要。对于中小企业来说&#xff0c;一款专业且易于使用的财务软件更是必不可少的工具。今天&#xff0c;我们就来详细了解一款深受中小企业喜爱的财务软件——易舟云。 财务管理的云端革命 随着云技术的发展&#xff0c;…

LeetCode:419. 甲板上的战舰(遍历 Java)

目录 419. 甲板上的战舰 题目描述&#xff1a; 实现代码与解析&#xff1a; 遍历 原理思路&#xff1a; 419. 甲板上的战舰 题目描述&#xff1a; 给你一个大小为 m x n 的矩阵 board 表示甲板&#xff0c;其中&#xff0c;每个单元格可以是一艘战舰 X 或者是一个空位 . &…

关于flutter 启动 页面加载空白(三四秒空白页面)

一:可以在 对应的xml配置启动动画 <item><bitmapandroid:gravity"center"android:src"mipmap/ic_launcher" /></item> 二&#xff1a;以下是对应的文件目录 注意事项&#xff1a;俩处xml都配置一下&#xff0c;配置一样就可以了

常见数据编码方式

数据编码方式&#xff1a; 二进制数字信息在传输过程中可以采用不同的代码&#xff0c;各种代码的抗噪声特征和定时功能各不相同&#xff0c;实现费用也不一样。下面介绍几种常用的编码方式。 1、单极性码 在这种编码方案中&#xff0c;只用正的&#xff08;或负的&#xff09;…

计算机哈佛架构、冯·诺依曼架构对比

哈佛架构和冯诺依曼架构是两种不同的计算机系统架构&#xff0c;它们在存储器组织方式上有着显著的区别。下面是它们的原理、优缺点的对比以及一些常见的 MCU 采用的架构&#xff1a; 哈佛架构&#xff1a; 原理&#xff1a;哈佛架构将指令存储器&#xff08;程序存储器&#x…

PyCharm QThread 设置断点不起作用

背景&#xff1a; 端午节回来上班第一天&#xff0c;不想干活&#xff0c;领导又再后面看着&#xff0c;突然想起一个有意思的问题&#xff0c;为啥我的程序在子进程QThread的子类里打的断点不好用呢&#xff1f;那就解决一下这个问题吧。 原因&#xff1a; 如果您的解释器上…

面试-NLP八股文

机器学习 交叉熵损失&#xff1a; L − ( y l o g ( y ^ ) ( 1 − y ) l o g ( 1 − ( y ^ ) ) L-(ylog(\hat{y}) (1-y)log(1-(\hat{y})) L−(ylog(y^​)(1−y)log(1−(y^​))均方误差&#xff1a; L 1 n ∑ i 1 n ( y i − y ^ i ) 2 L \frac{1}{n}\sum\limits_{i1}^{n}…

【Python基础】名称空间和作用域

1.名称空间 将栈区进行分类&#xff0c;这些分类就是名称空间 名称空间存放什么名字空间个数何时创建&销毁内置名称空间built-inPython解释器内置的名字1个Python解释器启动&解释器关闭 全局名称空间 global Python文件内定义的类名&#xff0c;变量名&#xff0c;模块…

【FreeRTOS】ARM架构汇编实例

学习视频 【FreeRTOS入门与工程实践 --由浅入深带你学习FreeRTOS&#xff08;FreeRTOS教程 基于STM32&#xff0c;以实际项目为导向&#xff09;】 https://www.bilibili.com/video/BV1Jw411i7Fz/?p9&share_sourcecopy_web&vd_source8af85e60c2df9af1f0fd23935753a933…

php yield使用

一&#xff0c;概念 yield简单的调用形式看起来像一个return申明&#xff0c;不同之处在于普通return会返回值并终止函数的执行&#xff0c;而yield会返回一个值给循环调用此生成器的代码并且只是暂停执行生成器函数。yield只有在调用的时候才会执行&#xff0c;并不产生多余的…

点云分割报告整理(未完成版-每天写一点)

体积占用网格表示对点进行体素化&#xff0c;然后使用3d卷积神经网络来学习体素级语义。由于点云的稀疏性&#xff0c;体素化效率低&#xff0c;为避免较高的计算成本而忽略了细节。此外&#xff0c;由于同一体素内的所有点都被赋予了相同的语义标签&#xff0c;因此精度受到限…

UPerNet 统一感知解析:场景理解的新视角 Unified Perceptual Parsing for Scene Understanding

论文题目&#xff1a;统一感知解析&#xff1a;场景理解的新视角 Unified Perceptual Parsing for Scene Understanding 论文链接&#xff1a;http://arxiv.org/abs/1807.10221(ECCV 2018) 代码链接&#xff1a;https://github.com/CSAILVision/unifiedparsing 一、摘要 研究…

深圳比创达电子|EMI电磁干扰行业:挑战到突破,电子产业新未来

随着电子技术的飞速发展&#xff0c;电磁干扰&#xff08;EMI&#xff09;问题日益凸显&#xff0c;成为影响电子设备性能和稳定性的重要因素。EMI电磁干扰行业作为解决这一问题的关键领域&#xff0c;正面临着前所未有的机遇与挑战。 一、引言&#xff1a;EMI电磁干扰行业的崛…

【Linux】shell脚本变量——系统变量、环境变量和用户自定义变量

系统变量 系统变量是由系统预设的&#xff0c;它们通常在系统启动时被加载&#xff0c;并对所有用户和所有shell实例都有效。这些变量通常控制着系统的行为和配置&#xff0c;例如PATH&#xff08;命令搜索路径&#xff09;、HOME&#xff08;用户主目录&#xff09;等。系统变…

JavaScript的运算符(算术、比较、赋值、逻辑、条件)

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

马斯克怒了,禁止员工使用苹果设备,抨击库克出卖数据给OpenA

昨晚&#xff0c;苹果发布会正式宣布了一系列重磅AI升级&#xff0c;甚至创造了一个新的概念——苹果智能&#xff08;Apple Intelligence&#xff09;。 这次升级在操作系统的交互层面上进行了智能化改进&#xff0c;使得更多自然语音和语言理解的控制成为可能&#xff0c;将…