【GD32F427开发板试用】FOC矢量算法研究系列之一:PWM实现呼吸灯

news2024/11/18 0:36:09

本篇文章来自极术社区与兆易创新组织的GD32F427开发板评测活动,更多开发板试用活动请关注极术社区网站。作者:Q_dGHvwj

前言

有幸被选为此次开发板测评活动的参与者,万分感谢。收到板子后迫不及待的拆来查看,画风整齐美观,简洁的设计,全面含盖了主芯片的所有引脚,测试如需用到引脚,需个人自行焊接排针。本次测评先以一份PWM输出实现呼吸灯的代码开篇,采用定时器实现PWM输出。
呼吸灯,就是指灯光设备的亮度随着时间由暗到亮逐渐增强,再由亮到暗逐渐衰减,很有节奏感地一起一伏,就像是在呼吸一样,被广泛应用在手机、电脑等电子设备的指示中。

一.相关知识介绍

脉冲宽度调制(PWM):是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。
频率:时钟速度 1GHZ = 1000MHZ = 1000 000 KHZ =1 000 000 000 HZ(如12MHz:1秒12 000 000个脉冲)
占空比:占空比是指在一个脉冲循环内,通电时间(有效电平)相对于一个脉冲总时间所占的比例。(可以简单理解为该高、低电平的占脉冲总时间的比例)。

PWM原理如下图所示:

这就是一个简单的PWM原理示意图。图中,我们假定定时器工作在向上计数PWM模式,且当CNT<CCRx时,输出0,当CNT>=CCRx时输出1。那么就可以得到如上的PWM示意图:当CNT值小于CCRx的时候,IO输出低电平(0),当CNT值大于等于CCRx的时候,IO输出高电平(1),当CNT达到ARR值的时候,重新归零,然后重新向上计数,依次循环。改变CCRx的值,就可以改变PWM输出的占空比,改变ARR的值,就可以改变PWM输出的频率,这就是PWM输出的原理。
查看GD32F4xx系列器件的用户手册,可以发现,其中除了TIM5和6(基本定时器)以外,其他的定时器都可以用来产生PWM输出。这里考虑到板子自带的LED2是接在了PC6引脚上,通过引脚复用功能的重映射配置TIMER2\\_CH0到 PC6上,由TIMER2\\_CH0输出PWM波来控制LED2的亮度,如呼吸一样的闪烁。

二.代码实现

本次以兆易创新库开发的方式进行代码的编写。

1.配置GPIO

本实验使用PC6作为定时器PWM输出通道,先对它进行初始化。用作PWM输出通道的引脚需要被配置为复用推挽输出模式。关于引脚功能复用的介绍详见GD32F427xx\_Datasheet\_Rev1.2这份芯片数据手册的第2.6小节Pin definitions。

/*!
    \brief      configure the GPIO ports
    \param[in]  none
    \param[out] none
    \retval     none
*/
void gpio_config(void)
{
    rcu_periph_clock_enable(RCU_GPIOC);
    
    /*Configure PC6(TIMER2 CH0) as alternate function*/
    gpio_mode_set(GPIOC, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_6);
    gpio_output_options_set(GPIOC, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_6);

    gpio_af_set(GPIOC, GPIO_AF_2, GPIO_PIN_6);
}

2.配置定时器模式

在timer\_config()函数中,完成了呼吸灯所需要的定时器PWM输出模式配置。

/*!
    \brief      configure the TIMER peripheral
    \param[in]  none
    \param[out] none
    \retval     none
*/
void timer_config(void)
{
    /* -----------------------------------------------------------------------
    TIMER2 configuration: generate 1 PWM signals with variable duty cycles:
    TIMER2CLK = SystemCoreClock / 200 = 1MHz
    ----------------------------------------------------------------------- */
    timer_oc_parameter_struct timer_ocinitpara;
    timer_parameter_struct timer_initpara;

    rcu_periph_clock_enable(RCU_TIMER2);
    rcu_timer_clock_prescaler_config(RCU_TIMER_PSC_MUL4);

    timer_deinit(TIMER2);

    /* TIMER2 configuration */
    timer_initpara.prescaler         = 199;
    timer_initpara.alignedmode       = TIMER_COUNTER_EDGE;
    timer_initpara.counterdirection  = TIMER_COUNTER_UP;
    timer_initpara.period            = 250;
    timer_initpara.clockdivision     = TIMER_CKDIV_DIV1;
    timer_initpara.repetitioncounter = 0;
    timer_init(TIMER2,&timer_initpara);

    /* CH0 configuration in PWM mode */
    timer_ocinitpara.ocpolarity  = TIMER_OC_POLARITY_HIGH;
    timer_ocinitpara.outputstate = TIMER_CCX_ENABLE;
    timer_ocinitpara.ocnpolarity  = TIMER_OCN_POLARITY_HIGH;
    timer_ocinitpara.outputnstate = TIMER_CCXN_DISABLE;
    timer_ocinitpara.ocidlestate  = TIMER_OC_IDLE_STATE_LOW;
    timer_ocinitpara.ocnidlestate = TIMER_OCN_IDLE_STATE_LOW;

    timer_channel_output_config(TIMER2,TIMER_CH_0,&timer_ocinitpara);


    /* CH0 configuration in PWM mode1,variable duty cycle*/
    timer_channel_output_pulse_value_config(TIMER2,TIMER_CH_0,0);
    timer_channel_output_mode_config(TIMER2,TIMER_CH_0,TIMER_OC_MODE_PWM0);
    timer_channel_output_shadow_config(TIMER2,TIMER_CH_0,TIMER_OC_SHADOW_DISABLE);

    /* auto-reload preload enable */
    timer_auto_reload_shadow_enable(TIMER2);
    /* auto-reload preload enable */
    timer_enable(TIMER2);
}

3.主循环中延时函数5ms的引用

借助演示代码systick.c中的延时函数,来实现精确的5ms延时。
首先引用头文件:

#include "systick.h"

然后即可直接调用systick.c中的系统时钟配置函数systick\_config(),进行系统定时器中断的相关配置。

4.最终主函数逻辑

经过代码的整合,加上循环逻辑,不断的修改PWM波的占空比,就可以实现呼吸灯的效果了。

/*!
    \brief      main function
    \param[in]  none
    \param[out] none
    \retval     none
*/
int main(void)
{
    uint16_t i = 0;
    FlagStatus breathe_flag = SET;
    
    gpio_config();
    timer_config();
    systick_config();
    
    while(1)
    {
        /* delay a time in milliseconds */
        delay_1ms(5);
        if(SET == breathe_flag) 
            {
                i++;
            }
        else
            {
                i--;
            }
        if(250 < i)
            {
                breathe_flag = RESET;
            }
        if(0 >= i)
            {
                breathe_flag = SET;
            }
        
        TIMER_CH0CV(TIMER2) = (uint32_t)i;
    }
}

5.最终效果视频展示

https://www.bilibili.com/video/BV1qV4y1A7Cm​www.bilibili.com/video/BV1qV4y1A7Cm

三.后续

接下来将回归正题,接着进行FOC矢量算法相关的实验演示,研究SVPWM原理,Park与反Park变换,Clark与反Clark变换等。

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

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

相关文章

SpringCloudAlibabaNacosConfig学习笔记

目录 1. Nacos配置中心使用 2 搭建nacos-config服务 3 Config相关配置 4 .配置的优先级 5. RefreshScope 1. Nacos配置中心使用 官方文档&#xff1a; https://github.com/alibaba/springcloudalibaba/wiki/Nacosconfig Nacos 提供用于存储配置和其他元数据的key/value 存…

23种设计模式(十三)——代理模式【接口隔离】

文章目录 意图什么时候使用代理真实世界类比代理模式的实现代理模式的优缺点亦称:Proxy 意图 由于某些原因需要给某对象提供一个代理以控制对该对象的访问。这时,访问对象不适合或者不能直接引用目标对象,代理对象作为访问对象和目标对象之间的中介。 什么时候使用代理 1、…

论文投稿指南——中文核心期刊推荐(环境科学)

【前言】 &#x1f680; 想发论文怎么办&#xff1f;手把手教你论文如何投稿&#xff01;那么&#xff0c;首先要搞懂投稿目标——论文期刊 &#x1f384; 在期刊论文的分布中&#xff0c;存在一种普遍现象&#xff1a;即对于某一特定的学科或专业来说&#xff0c;少数期刊所含…

操作系统-操作系统引论(1)

操作系统的基本概念一、操作系统的定义二、操作系统的产生与发展三、操作系统的特征四、操作系统的功能五、操作系统的运行机制六、操作系统的体系结构一、操作系统的定义 资源管理的观点&#xff1a;操作系统是控制和管理计算机的软、硬件资源&#xff0c;并且合理的组织计算…

通过C++对【图】进行抽丝剥茧(包括广度、深度优先遍历,求最小生成树,求最短路径)

目录 一.图的基本概念 二.图的存储结构 1.邻接矩阵 &#xff08;1&#xff09;无向图、有向图矩阵存储 &#xff08;2&#xff09;实现&#xff1a; 2.邻接表 &#xff08;1&#xff09;无向图邻接表存储 &#xff08;2&#xff09;有向图邻接表存储 &#xff08;3&a…

windows下运行ROSEFusion

其实LZ已经不再是两年前的Linux小白了&#xff0c;至于为什么要在windows下配置环境&#xff0c;是因为LZ在Linux下已经成功编译成功了ROSEFusion&#xff0c;但运行时一直报错Frame could not be processed&#xff0c;在github下的issue里面查询得知可能是CUDA版本问题。另外…

VM16 Pro+ubuntu20.04.5+GAMIT10.71安装(20230118更新包)

VMware Workstation 16 Proubuntu20.04GAMIT10.71安装测绘老中医&#xff08;qq8212714&#xff09;&#xff08;2023-01-20&#xff09;NOTE:安装环境&#xff1a;Windows 10 专业版&#xff0c;64 位操作系统, 基于 x64 的处理器1、首先在计算机中安装VMware Workstation 16 …

交叉编译(全志)

文章目录一、交叉编译概念二 、香橙派交叉编译3.带WiringPi库的交叉编译一、交叉编译概念 交叉编译&#xff0c;就是&#xff1a;在一种平台上编译&#xff0c;编译出来的程序&#xff0c;是放到别的平台上运行即编译的环境&#xff0c;和运行的环境不一样&#xff0c;属于交叉…

【基础】高低位和大小端

大小端模式出现是为了兼容不同CPU采用的不同的指令集 PowerPC架构和x86架构采用的是不同的CPU指令集。PowerPC采用精简指令集&#xff08;RISC&#xff0c;reduced instruction set computer&#xff09;&#xff0c;x86指的是特定微处理器执行的一些计算机语言指令集。 Powe…

Obsidian 插件(一):DataView 的使用

文章目录DataView 的使用一、 环境配置二、 入门介绍1、 快速开始2、 页面和字段3、 创建查询4、 系统字段三、 接口讲解1、 表达式1.1 概述1.2 表达式类型1.3 特定类型的交互2、 函数2.1 构造器2.2 常用函数2.3 工具函数DataView 的使用 一、 环境配置 首先&#xff0c;我们…

ESP32设备驱动-DHT11温度湿度传感器驱动

DHT11温度湿度传感器驱动 1、DHT11介绍 DHT11数字温湿度传感器是一种复合传感器,包含一个经过校准的温湿度数字信号输出。 应用了专用的数字模块采集技术和温湿度传感技术,确保产品具有高可靠性和优异的长期稳定性。 该传感器包括一个电阻感湿元件和一个 NTC 温度测量装置,…

LeetCode题目笔记——1814. 统计一个数组中好对子的数目

文章目录题目描述题目难度——中等方法一&#xff1a;模拟&#xff08;超时&#xff09;&#xff08;参考&#xff09;代码/Python方法二&#xff1a;优化代码总结题目描述 给你一个数组 nums &#xff0c;数组中只包含非负整数。定义 rev(x) 的值为将整数 x 各个数字位反转得…

Kong Api Gateway

Kong Api Gateway什么是API 网关为什么是 Kong安装Kong通过包管理器来安装启动Kong配置文件详解1、常规配置2、Nginx注入配置3、数据库存储配置4、数据库缓存配置DNS解析器配置其他杂项配置API 管理详解1、查看节点信息2、查看节点状态3、添加服务4、查询服务5、查询所有服务6、…

golang入门笔记——Hertz

文章目录Hertz介绍应用层路由层协议层传输层HZ脚手架Hertz的使用一个简单的案例&#xff1a;利用Hertz监听8080端口并编写/ping的get处理函数Hertz和gin一样&#xff0c;提供了分组路由的功能Hertz路由的匹配优先级&#xff1a;静态路由>命名路由>通配路由参数绑定&#…

SD卡读写实验(SPI模式)

对于 SD 卡的 SPI 模式而言&#xff0c;采用的 SPI 的通信模式为模式 3&#xff0c;即 CPOL1&#xff0c;CPHA1&#xff0c;在 SD 卡 2.0 版本协议中&#xff0c;SPI_CLK 时钟频率可达 50Mhz。SD 卡的 SPI 模式&#xff0c;只用到了 SDIO_D3&#xff08;SPI_CS&#xff09;、SD…

16投影矩阵和最小二乘法

投影矩阵和最小二乘法 投影矩阵 **投影矩阵P与向量b相乘将会把投影到的列空间A中。**那么现在我们来考虑两个极端的例子&#xff0c;这两个极端的例子将会加深我们对投影矩阵的理解。 如果b在矩阵A的列空间里&#xff0c;那么 Pb b 如果b垂直于矩阵A的列空间&#xff0c;那…

经典同步问题

同步问题是一个复杂的问题&#xff0c;但是它也有自己的方法去处理、去分析。PV操作系统的解题思路&#xff1a;关系分析。找出题目中描述的各个进程&#xff0c;分析它们之间的同步、互斥关系。(从事件的角度分析)整理思路。根据各进程的操作流程确定P、V操作的大致顺序。设置…

Java设计模式-备忘录模式、备忘录模式应用场景是什么、又怎么使用

继续整理记录这段时间来的收获&#xff0c;详细代码可在我的Gitee仓库SpringBoot克隆下载学习使用&#xff01; 6.11 备忘录模式 6.11.1 定义 又称快照模式&#xff0c;在不破坏封装性的前提下&#xff0c;捕获一个对象的内部状态&#xff0c;并在该对象之外保存此状态&…

深入学习Vue.js(十一)内建组件和模块

文章目录KeepAlive组件的实现原理1.KeepAlive组件实现原理2.KeepAlive组件的代码实现&#xff08;1&#xff09;shouldKeepAlive&#xff08;2&#xff09;keepAliveInstance&#xff08;3&#xff09;keptAlive&#xff08;4&#xff09;move函数3.include和exclude4.缓存策略…

视频生成动画数据OpenPose+OpenCV

我们只是使用OpenPose&#xff0c;不包括深度学习和代码的部分&#xff0c;会用就OK。 1.打开OpenPose的官网&#xff0c;直接进入安装页面&#xff0c;地址如下&#xff1a; OpenPose: OpenPose Doc - Installation 2.安装的说明&#xff0c;大家要好好看&#xff0c;我们就…