前言
基于RTT的PWM设备框架下,输出PWM波,利用Simonk电调驱动2212电机
一、新建工程
二、打开CubeMX
三、配置外部高速晶振为时钟输入
四、配置调试下载接口
五、打开pwm输出通道,我这里用到的是定时器三的CH1
六、创建工程的时候默认使用了串口一,所以串口一也打开。
七、配置时钟,一般直接拉满
八、生成代码
九、打开定时器和PWM设备驱动程序
十、打开定时器三PWM通道1宏定义
十一、打开定时器三宏定义
十二、打开定时器模块宏定义
十三、复制cubemx文件夹下的main.c中生成的这段代码,粘贴到board.c末尾
十四、复制cubemx生成的这两段代码,粘贴到board.c的末尾
十五、编译报错
十六、在board.c文件前面写入如下代码,外部定义htim3
十七、再编译,如下报错
十八、重定义了,将这两段代码进行注释
十九、再编译,报错解决
二十、在主函数写入如下代码
/*
* Copyright (c) 2006-2024, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2024-01-25 RT-Thread first version
*/
#include <rtthread.h>
#include <rtdbg.h>
#include <board.h>
#include <rtdevice.h>
#define PWM_DEV_NAME "pwm3"
#define PWM_DEV_CHANNEL 1
struct rt_device_pwm *pwm_dev; //pwm设备句柄
rt_uint32_t period = 20000000; //单位us 向左6位,变毫秒 20ms
rt_uint32_t pulse = 1000000;
rt_err_t ret = RT_EOK; //返回值校验
int main(void)
{
/* 查找pwm设备 */
pwm_dev = (struct rt_device_pwm *)rt_device_find(PWM_DEV_NAME);
if (pwm_dev == RT_NULL)
{
rt_kprintf("pwm sample run failed! can't find %s device!\n", PWM_DEV_NAME);
return RT_ERROR;
}
/* 设置PWM周期和脉冲宽度默认值 */
rt_pwm_set(pwm_dev, PWM_DEV_CHANNEL, period, pulse);
/* 使能设备 */
rt_pwm_enable(pwm_dev, PWM_DEV_CHANNEL);
return RT_EOK;
}
二十一、下载程序,周期20ms,占空比1ms,波形正确
二十二、修改一下占空比,下载程序
二十三、电机起转,波形正确