无人机飞控项目

标准库

hal库

②stm32的pwm

可以直接搜函数名查询使用方法

比如可以直接搜

STM32——PWM知识详解_stm32pwm配置详解-CSDN博客

STM32F429第二十一篇之PWM波实现详解_ocidlestate-CSDN博客

或者直接看hal库的例程

        stm32有普通IO口与PWM口,尽量用pwm口输出pwm,普通IO口会占用资源。

Prescaler 预分频系数
输入给计数器的信号频率 = 输入到预分频器的信号频率 / (预分频系数 + 1)
该值为0相当于对输入信号1分频,也就是不分频;该值为1相当于对输入信号2分频,依此类推;
在STM32系列中该值常见取值范围为0~65535;
CounterMode 计数模式
计数模式常见的就是 Up(向上计数模式),这个模式下计数器初始值为0,计数到下面的 Period+1 算作一个周期;
其它可选值 Down(和UP反一反),Up/down(第一个周期是UP、第二个周期是Down,反复进行);
Period 计数周期
以 Up模式 为例,在此模式下计数器从0开始计数,每一个信号计数值+1, 当计数Period次之后计数器值为Period,当再有一个信号进入后就算计数满一个周期 ,可以触发溢出中断或是其它动作;
在STM32系列中该值常见取值范围为0~65535;
AutoReloadPreload 预装载
计数器再计满一个周期之后会自动重新计数,也就是默认会连续运行。这连续运行过程中如果你修改了Period,那么根据当前状态的不同有可能发生超出预料的过程。如果使能了AutoReloadPreload,那么你对Period的修改将会在完成当前计数周期后才更新;

"Auto-reload Preload"(自动重装载预加载)用于控制PWM模块在计数器溢出时是否自动加载已预先加载的值。当"Auto-reload Preload"禁用时,称为"Disable",当它启用时,则称为"Enable"。下面是禁用和启用"Auto-reload Preload"的区别:

一.Disable(禁用):
2.计数器在溢出时不会自动加载已预先加载的值。
3.每个计数周期的比较值(比如占空比)可以动态地更改,提供更大的灵活性。
4.可以在每个计数周期之间更改自动重装载值,但可能会引入一些延迟。
5.节约内存:可以使用较小的PWM数据结构来节省内存,因为不需要存储预加载的值。
二.Enable(启用):
1.计数器在溢出时会自动加载已预先加载的值。
2.每个计数周期的比较值(比如占空比)在计数周期开始时就已确定,无法在计数周期中动态更改。
3.更改自动重装载值实时生效,没有额外的延迟。
4.可能会使用较大的PWM数据结构来存储预加载的值。

选择禁用或启用"Auto-reload Preload"取决于应用需求和设计考虑。禁用它可以提供更大的灵活性和节省内存的优势,但可能会引入一些精度和同步问题。启用它可以提供更稳定的输出信号和实时更改自动重装载值的能力,但可能需要更多的内存空间。

在while循环功能实现中,比较重要就是一行代码,修改PWM波的占空比,通过函数TIM_SetTIM3Compare4()实现。

/** 
 * @brief 修改比较值
 * @note 无
 * @param {*}比较值
 * @retval 无
 */

void TIM_SetTIM3Compare4(u32 compare)
{
    TIM3->CCR4 = compare;
}

也可以用定义了的宏函数(不推荐)

#define __HAL_TIM_SET_COMPARE(__HANDLE__, __CHANNEL__, __COMPARE__)


pwm输出时必须时AF__pp,不能是out__pp,因为只有将引脚配置为复用推挽输出,引脚才能把输出控制权交给片上外设,PWM波形才能通过引脚输出。

STM32输出PWM波形GPIO引脚配置-CSDN博客

涉及多个引脚和初始化的配置时不要用|(或)来省力(坑),这样会不能初始化函数。一定要分开来初始化。

FIFO原理及其应用-CSDN博客

FIFO(First In First Out,即先入先出),是一种数据缓冲器。先被写入的数据会按顺序先被读出。FIFO可看做一个管道,有数据写入端口和 数据读取端口:

1、当两个模块的时钟不一致,它们之间需要进行数据传输时。(如A模块的数据需要传输到B模块进行处理),此时就需要做跨时钟域处理。先把模块A的数据按照clk_A写入FIFO,然后模块B再按clk_B读取FIFO中的数据,因此数据data在模块B中就能得到正确的处理!

2、当两个模块的数据传输端口带宽不一致,其它们之间需要进行数据传输时。此时就需要做带宽同步处理。 先把模块A的数据按照clk_A写入FIFO(设模块A输出的数据位宽为4,此时也把FIFO的数据写入端口位宽设置为4),然后模块B再按clk_B读取FIFO中的数据(设模块B输入的数据位宽为8,此时也把FIFO的数据读取端口位宽设置为8),从而实现了带宽同步。

在进行标准库一直到hal库时遇到的问题:

这主要是把头文件调用问题

在移植代码时技巧:可以先屏蔽不需要的头文件调用,然后运行,运行后可以看error里差了哪些函数,并调用头文件。由简入繁。

2024_4_17

这里的模式一定要选对,别选成compare模式了


 

使用 CH1N,CH2N互补的输出来控制pwm

  • 18
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值