4673|2

654

帖子

26

TA的资源

版主

楼主
 

46“万里”树莓派小车——PicoW学习(PWM、定时器) [复制链接]

 
本帖最后由 lb8820265 于 2023-11-1 22:45 编辑

    使用Pico W做底盘,需要至少有以下外设:GPIO,PWM,定时器,编码器读取和WiFi。GPIO,PWM,UART,定时器,这几个外设都有例程可以参考,移植起来也比较容易,这里一起介绍,顺便介绍一下工程移植过程。

目标

    创建呼吸灯工程,设置两个个引脚为PWM输出连接LED,在定时器中断中改变PWM输出占空比,并通过UART输出定时器的间隔。

PWM简介

    在写代码之前需要大致了解该芯片的PWM外设,PicoW主控芯片是RP2040,所以如果要详细的了解相关外设,可阅读芯片手册,在帖子最后有下载。PWM在数据手册的523页,所有的30个GPIO都可以用来输出PWM,一共16个PWM通道,由8个2通道的slices组成,也就是一个slices可以输出给两个引脚,可设置不同的占空比等。

 

 

    PWM有一个不断增加计数器,通过TOP寄存器的值来周期,通过设置比较的值来控制占空比。普通模式(free-running模式)如下图。

 

    PWM的频率公式如下。

 

    fsys:PWM时钟,使用的CLK SYS,默认是等于PLL SYS=125Mhz

    TOP:周期设置寄存器,默认65535

    CSR_PH_CORRECT:相位校正模式,默认为0(普通模式)

    DIV_INT:是时钟分配寄存器,1~255,默认为1

    DIV_FRAC:FRAC是fractional的缩写,也就是小数,0~15,默认0

新建工程

    使用前面介绍的方法打开工具“pico project generato”,勾选“HW TImer”,发现并没有PWM相关的模块可以勾选,这里我们尝试选择小车工程会需要的外设如下。

 

    将例程中的“.viscode”文件夹复制到生成的工程中。生成的文件与大致的功能如下。

 

打开工程

    打开“Pico - Visual Studio Code”软件,在软件中打开刚刚生成的工程文件夹。

 

    会自动弹出选择编译工具,这两个任选一个都行,如果打开的时候错过了,可以点击最下方状态栏的“No Kit Selected”重新选择。

 

配置工程

    重点关注“CMakeLists.txt”文件,这是CMake的配置文件。在“CMakeLists.txt”文件找到target_link_libraries,该指令的作用为将目标文件与库文件进行链接。

可以看到已有两个库文件,就是我们在工具中勾选的,从例程中得知,PWM的库文件名叫做“hardware_pwm”,因此添加该库文件如下。

 

    还有一个add_executable指令,该指令的含义是使用“Test_Timer_PWM.c ”源文件生成“Test_Timer_PWM”可执行文件。

    可以有多个该指令,生成多个可执行文件,可配合“target_link_libraries”指令链接不同的库,生成不同的可执行文件。

    这里增加一个“peripherals.c”文件用来写外设的配置代码,如下。

 

    新建“peripherals.c”与“peripherals.h”文件在根目录。

编写代码

    PWM初始化如下:

void PWM_init(){
    gpio_set_function(PIN_PWM_1, GPIO_FUNC_PWM);//设置引脚为PWM功能
    gpio_set_function(PIN_PWM_2, GPIO_FUNC_PWM);
    uint slice_num = pwm_gpio_to_slice_num(PIN_PWM_1);//根据GPIO获取对应的slice号
    pwm_config config = pwm_get_default_config();//获取默认的设置
    pwm_config_set_clkdiv(&config, 4.f);//配置该slice的PWM的频率,4分频clk_sys
    pwm_init(slice_num, &config, true);//配置并启动该PWM
}

    定时器初始化如下:

void Timer_init(){
    //配置定时器,-50表示50ms定时,负数表示从进入该函数开始计算,repeating_timer_callback是回调函数名
    add_repeating_timer_ms(-50, repeating_timer_callback, NULL, &timer);
}

    定时器回调函数如下:

bool repeating_timer_callback(struct repeating_timer *t) {
    static absolute_time_t t_from;
    absolute_time_t t_to;
    int64_t t_delta;
    static int fade = 0;
    static bool going_up = true;
    t_to=get_absolute_time();//获取上电开始的绝对时间
    t_delta=absolute_time_diff_us(t_from,t_to);//获取时间差,转化为us
    t_from=t_to;//保存上次的值
    printf("time_diff_us: %8d\n", (int)t_delta);
    if (going_up) {
        ++fade;
        if (fade > 255) {
            fade = 255;
            going_up = false;
        }
    } else {
        --fade;
        if (fade < -255) {
            fade = -255;
            going_up = true;
        }
    }
    pwm_set_gpio_level(PIN_PWM_1, fade * fade);//最大值65535,数值的平方更适合呼吸灯
    pwm_set_gpio_level(PIN_PWM_2, 65535-fade * fade);
}

    运行后,使用串口助手连接仿真器生成的串口,可以看到返回的数值都是50000,说明定时器非常的精准。

  

    使用LED灯连接Pin14和Pin15另一端连接GND就可以看到灯交替闪烁了。使用示波器观察引脚频率,结合前面的PWM频率计算公式,理论上应该是125M/65536/4=476.84Hz,示波器实测的频率为476.9Hz,如下。

  

RP2040数据手册: rp2040-datasheet.pdf (5.07 MB, 下载次数: 3)
代码源文件: Test_Timer_PWM.zip (731.83 KB, 下载次数: 0, 售价: 2 分芯积分)

最新回复

这个介绍很详细,开拓了眼界,希望对自己的项目有启发   详情 回复 发表于 2023-11-7 02:30
点赞 关注
个人签名QQ:252669569
 
 

回复
举报

1237

帖子

66

TA的资源

纯净的硅(中级)

沙发
 

这玩意咋不用arduino或者micropython玩玩,很方便,比C简单

 
 
 

回复

731

帖子

4

TA的资源

纯净的硅(高级)

板凳
 

这个介绍很详细,开拓了眼界,希望对自己的项目有启发

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
推荐帖子
应用技巧/用68HC908GP32单片机实现EPP增强并口的接口技术

摘要:本文介绍了计算机并口的几种操作模式,给出了实现EPP接口设计的几种方案;着重介绍用Motorola公司的68HC908GP32单片机 ...

常用网络命令

常用网络命令 计算机网络的主要优点是能够实 ...

友善之臂嵌入式浏览器中文支持移植成功

经过本人的改造,友善之臂的qtopia自带的浏览器终于支持中文网页了,也就是,如果能把应用程序再汉化下,就可以应用到开发中。空 ...

谈谈我写书的经历

写书,在一些人看来是一个非常光荣而又伟大的事情;在又一些人看来却是一件赚钱的行当。为了让大家真正认识到写书的痛苦与艰辛, ...

留住身边的美景,2015年春天

本帖最后由 mmmllb 于 2015-4-9 12:28 编辑 不知道说现在是春天是否合适:Sweat:,先这么叫着。 话说最近各路的花都开了,有 ...

【DIY创意LED】参考设计(原理图+PCB)

本帖最后由 dcexpert 于 2020-9-15 17:05 编辑 这次使用了立创EDA进行设计,一个原因是立创EDA是国产免费软件,容易查找器件 ...

AD-DC整流、精密整流

AD-DC整流、精密整流: 1.整流桥、四个二极管整流和运放整流有哪些区别? 2.整流之后,为何把正半周信号丢弃了,并且 ...

直流转换电源电感下的铺铜

本帖最后由 qwqwqw2088 于 2022-7-18 09:08 编辑 对DC/DC 电源的电感底部是否应该铺铜这个问题,常常有意见分歧。 一种认为, ...

【Follow me第二季第1期】 开发环境的搭建-基于CircuitPython

二、开发环境的搭建(基于CircuitPython) 安装或更新CircuitPython 单击上面的链接并下载最新的 UF2 文件这里选择中 ...

MOSFET栅极振荡

那么是不是栅极驱动电流越大越好呢也就是我们的驱动电阻的内阻是不是越小越好这也有可能带来问题我们来对驱动电路进行定量仿真用 ...

关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表