首页 > 其他分享 >关于RTthread使用PWM的总结经验(基于STM32F4系列)

关于RTthread使用PWM的总结经验(基于STM32F4系列)

时间:2024-06-13 14:31:08浏览次数:31  
标签:rt RT PWM RTthread pulse STM32F4 pwm DEV

目录

硬件资源介绍:

前期准备:

代码编写:

总结:


硬件资源介绍:

笔者使用的是STM32F407VET6是魔女开发板,因为RT不支持CMSIS-DAP烧录,所以我又准备了一个ST-link,一个红色的LED。我所使用的是TIM2-CH3通道,在我这个板子上对应的是PA2口。原理图如下所示。

可以看到PA2上对应的有TIM2_3。

前期准备:

首先是创建RTT项目

第一步:打开RT的Settings

第二步:接着打开项目中的baord.h进行如下几步修改

第三步:打开CubeMX生成代码将其中的有用代码贴到board.c后

第四步:打开stm32xxxx_hal_config.h进行修改

第五步:添加一句代码到drv_pwm.c

笔者也是找了很久bug才知道要加这句话,之前的时候一直都没解决,现在将他分享出来。

第六步:检查是否有所用定时器(TIM2是有的,一般通用定时器的有,高级定时器比如TIM1就没有,不过也可以模仿着TIM2的格式复制写一个TIM1)

代码编写:

在main.c中编写代码

/*
 * Copyright (c) 2006-2024, RT-Thread Development Team
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 * Change Logs:
 * Date           Author       Notes
 * 2024-06-13     RT-Thread    first version
 */

#include <rtthread.h>
#include <board.h>
#include <rtdevice.h>
#include <rtdbg.h>

#define PWM_DEV "pwm2"
#define PWM_DEV_CHAN 3

struct rt_device_pwm *pwm_dev;
rt_uint32_t period = 500000;   //周期值 500000ns 频率 2kHz
rt_uint32_t pulse = 0;         //脉宽变量

rt_uint8_t dir = 0;            //方向值


int main(void)
{

    //查找设备
    pwm_dev = (struct rt_device_pwm*)rt_device_find(PWM_DEV);
    if(pwm_dev == RT_NULL)
    {
        rt_kprintf("not find!");
        return RT_ERROR;
    }

    //设置参数
    //rt_pwm_set(pwm_dev, PWM_DEV_CHAN, period, pulse);
    rt_pwm_set(pwm_dev,PWM_DEV_CHAN, period, pulse);
    //启动设备
    rt_pwm_enable(pwm_dev, PWM_DEV_CHAN);

    while(1)
    {

        if(dir == 0)
        {
            pulse += 5000;
            if(pulse >= period)
            {
                dir = 1;
            }
        }

        if(dir == 1)
        {
            pulse -= 5000;
            if(pulse <= 0)
            {
                dir = 0;
            }
        }

        rt_pwm_set(pwm_dev, PWM_DEV_CHAN, period, pulse);
        rt_thread_mdelay(50);
    }


    return RT_EOK;
}

总结:

RT中的PWM还是比较方便的,就是遇到了一个Bug,导致这个F4系列的STM32连呼吸灯都实现不了,找到后也是立马总结一下,希望可以帮助到广大朋友们。


 

标签:rt,RT,PWM,RTthread,pulse,STM32F4,pwm,DEV
From: https://blog.csdn.net/qq_61786595/article/details/139651938

相关文章

  • C51学习归纳11 --- PWM原理、应用案例
        本节进入到一个更加常用的环节PWM的产生与应用,日常生活中,电机的使用非常普及,如何控制转速?其实就可以应用我的PWM。一、PWM的产生原理    PWM(PulseWidthModulation)即脉冲宽度调制,在具有惯性的系统中,可以通过对一系列脉冲的宽度进行调制,来等效地获得所需......
  • stm32系列--PWM捕获功能
      Capture_Init(59999,120-1);//可捕获最小频率72M/(120*60000)=17*0.6=10HzPA1//TIM2_CH2PA7做为捕获通道//输入捕获能捕获到的最小的频率为72M/{(ARR+1)*(PSC+1)}voidCapture_Init(u16arr,u16psc){GPIO_InitTypeDefGPIO_InitStructure;......
  • STM32F407 hal库FFT
    简介:本文所用开发板为立创天空星,主控芯片为STM32F407VET6,F407系列应该都能使用本文的方法。也推荐大家可以买一块立创天空星玩玩,很好用。1.设置调试模式为SWD调试2.将低速和高速时钟设置为外部时钟源3.时钟设置(按下图即可)4.设置ADC,可以和中断部分一起看注意DMA设定时......
  • STM32使用定时器在普通gpio上模拟pwm-红牛开发板LED1的亮度调节
    stm32F103zet只有固定的几个针脚可以输出tim定时器信号,在不支持tim输出的口上就没法输出pwm,在红牛开发版上的表现就是控制lcd屏幕亮度的a1针脚,可以输出pwm,屏幕亮度可以无极调节,但是4个led灯就只能控制开关。使用arduino的analogWrite函数,只能调节开关。可以用定时器的中断来控制......
  • 逆变器的PWM分辨率理解
    一、脉冲宽度调制PWM是PulseWidthModulation的缩写,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。1.PWM基本原理简单的讲无论是什么形状的电压波形只要波型与坐标轴t围成的阴影面积相同则产生的效果是一样的。图中正弦波和方波输出的平均电压一样......
  • PMSM永磁同步电机滑膜控制SVPWM矢量控制(Simulink仿真实现)
      ......
  • 双馈异步风力发电机DFIG双馈风机SVPWM(Simulink仿真实现)
      ......
  • stm8系列--可变频率PWM输出
     PA3STM8S003F3timer2_init();//初始化#definePUL_COUNT4000voidtimer2_init(void){TIM2_DeInit();TIM2_TimeBaseInit(TIM2_PRESCALER_8,PUL_COUNT-1);//62.5HZ2M/8/4000=62.5HZ1个数4usTIM2_OC3Init(TIM2_OCMODE_PWM1,TIM2_OUTPUTS......
  • STM8系列--PWM捕获输入检测
    最重要的下载程序的optionbety设置;函数1:voidInit_Timer1(void){GPIO_Init(GPIOC,GPIO_PIN_6,GPIO_MODE_IN_PU_NO_IT);//输入浮动,没有外部中断TIM1_DeInit();//tim1定时器寄存器全部复位TIM1_Ti......
  • LED车灯150v降压恒流驱动芯片AP5191pwm精确调光过温保护
    产品描述AP5191是一款PWM工作模式,高效率、外围简单、内置功率MOS管,适用于4.5-150V输入的高精度降压LED恒流驱动芯片。输出最大功率150W,最大电流6A。AP5191可实现线性调光和PWM调光,线性调光脚有效电压范围0.55-2.6V.AP5191工作频率可以通过RT外部电阻编程来设定,同时内置抖频......