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

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

原理:

cnt(向上计数单元)计数到重装载值的值时触发中断或更新,重新归零,而捕获计数值arr在等于cnt时发送更改,从无效电平变成有效电平,或者从有效电平变成无效电平

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);
    }
}
  • 32
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32F407探索者开发是一款基于STM32F407芯片的开发,广泛应用于嵌入式系统开发和学习。 该开发的原理图是描述其电路连接和工作原理的图纸。原理图展示了芯片与其他电子元件之间的连接方式,以及各个电子元件之间的关系。通过原理图,我们可以理解开发各个功能模块的分布和工作原理,为后续的电路调试和开发提供了重要的参考依据。 在STM32F407探索者开发的原理图中,可以看到包括微控制器、时钟源、存储器、通信接口、传感器接口、显示屏接口等主要模块。微控制器是整个系统的核心,它负责控制和管理其他模块的工作。时钟源提供系统的时钟信号,确保各个模块同步工作。存储器模块包括闪存、RAM和EEPROM等,用于存储程序代码和数据。通信接口模块包括UART、SPI、I2C等,用于与其他设备进行数据交互。传感器接口模块用于连接各种传感器,实现对外部环境的感知和采集。显示屏接口用于连接显示屏,实现信息展示。 通过原理图,我们可以清楚地了解到各个模块之间的连接关系和信号传输方式。同时,原理图也提供了电阻、电容、晶振、电感等器件的数值信息,有助于设计人员选择合适的元件和进行电路调试。 总之,STM32F407探索者开发的原理图是一份非常重要的参考资料,它为开发者提供了设计和调试的依据,帮助开发者更好地理解和应用该开发,同时也为学习者提供了学习嵌入式系统的宝贵资料。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值