2142|2

690

帖子

25

资源

版主

6“万里”树莓派小车——wiringPi学习(PWM与外部中断模拟定时器) [复制链接]

本帖最后由 lb8820265 于 2021-11-29 00:44 编辑

前面介绍C语言下使用线程然后查询的方法实现定时器的功能不靠谱,我创新的想到了另一种方法,PWM与外部中断组合成一个定时器。

原理是使用树莓派产生PWM波形,然后将产生PWM波形的引脚与外部中断输入引脚相连,这样控制PWM波形的频率就等于控制了定时器的周期。

        树莓派4拥有4个PWM输出引脚,树莓派功能引脚位置如下。

image-20211129003631-1.png wiringPi库的引脚定义有自己的一套规则,例如物理位置12的引脚,就是wpi下的1号引脚,BCM定义下的18号引脚。各规则引脚定义如下图。

image-20211129003631-2.png        选择wPi编码的引脚1作为PWM产生引脚,引脚0作为外部中断输入引脚,使用一个跳帽将两个引脚短接。

PWM的输出频率计算公式为

     PWMfreq =54000000/divisor/range

      如果我想定时器时间为10ms,那么输出频率为100Hz,因此,divisor可以设为540,range设为1000。

代码

#include <stdio.h>
#include <wiringPi.h>
long now;
long pre_time;
void myInterrupt (void) {
 now=micros();
 printf ("%ld,%ld\n",now,now-pre_time);
 pre_time=now;
}
int main (void)
{
  wiringPiSetup () ;
  pinMode (1, PWM_OUTPUT) ;
  pwmSetMode(PWM_MODE_MS);
  pwmSetClock (540);
  pwmSetRange (1000);
  pwmWrite (1, 500) ;
  wiringPiISR (0, INT_EDGE_FALLING, &myInterrupt) ;
  for(;;){
  }
   return 0 ;
}

代码中主要函数介绍如下:

pwmSetClock (int divisor)

divisor:设置PWM时钟的分频。范围:2 ~ 4095

注:PWM基础时钟54MH

pwmSetMode (int mode)

mode:PWM发生器能在2中模式下工作,对应的设置参数:PWM_MODE_BAL(默认) 与 PWM_MODE_MS。

注:通常模式设置为 PWM_MODE_MS

pwmSetRange (int range)

range:用来设置PWM的周期,默认值是1024。

pwmWrite (int pin, int value)

pin:硬件PWM引脚编号(在WiringPi中的编号),将在该引脚上产生PWM波。

value:设置占空比,value取值范围:0 ~ range

wiringPiISR (int pin, int edgeType,  void (*function)(void))

pin:接受中断信号的引脚

edgeType:触发的方式。

 INT_EDGE_FALLING:下降沿触发
 INT_EDGE_RISING:上升沿触发
 INT_EDGE_BOTH :上下降都会触发
 INT_EDGE_SETUP:编程时用不到。   

Function:参数是中断处理函数的指针,它是一个无返回值,无参数的函数。

运行结果

代码的作用是引脚1产生100Hz的PWM方波,引脚0设置为外部中断输入,并输出每次进入的时间和上次的时间差。

image-20211129003631-3.png     可以发现几乎所有数据都存在误差,但是误差都在±1%以内,较长时间累计也较为准确,因此该方法可行,但是该方法需要一个跳帽,不是很优雅。

问题

使用python语言,同样PWM与外部中断模拟定时器的效果又会怎么样呢?

源码

GitHub:

提示词:如果您需要查看本帖隐藏内容,请登录或者注册

Gitee:

提示词:如果您需要查看本帖隐藏内容,请登录或者注册

个人签名QQ:252669569

回复

1万

帖子

2853

资源

管理员

"万里"树莓派小车汇总贴:

lb8820265的“万里”树莓派小车开源分享 - DIY/开源硬件专区 - 电子工程世界-论坛 (eeworld.com.cn)

 

目录:

 

“万里”树莓派小车开张贴 

1“万里”树莓派小车——建立项目仓库

2“万里”树莓派小车——python学习(Thonny的使用)

3“万里”树莓派小车——python学习(定时任务)

4“万里”树莓派小车——C++学习(编译与运行,geany使用)

5“万里”树莓派小车——wiringPi学习(延时与线程模拟定时器)

6“万里”树莓派小车——wiringPi学习(PWM与外部中断模拟定时器)

7“万里”树莓派小车——RPi.GPIO学习(PWM与外部中断模拟定时器)

8“万里”树莓派小车——socket学习(本机通讯)

9“万里”树莓派小车——socket学习(TCP两机通讯)

10“万里”树莓派小车——socket学习(UDP两机通讯)

11“万里”树莓派小车——socket学习(Android发送)

12“万里”树莓派小车——socket学习(Android收发)

13“万里”树莓派小车——配件准备

14“万里”树莓派小车——电机驱动学习

15“万里”树莓派小车——光电编码器学习(正反转的判断)

16“万里”树莓派小车——光电编码器学习(转速的获取)

17“万里”树莓派小车——VSCode学习(编译和调试)

18“万里”树莓派小车——Makefile学习

19“万里”树莓派小车——VSCode学习(多C文件链接调试)

20“万里”树莓派小车——电机控制学习(控制速度)

21“万里”树莓派小车——电机控制学习(4轮速度控制)
22“万里”树莓派小车——手机遥控电机转动

23“万里”树莓派小车——无屏幕连接树莓派

24“万里”树莓派小车——树莓派64位系统bullseye跑分测试

25“万里”树莓派小车——纳姆轮控制

26“万里”树莓派小车——程序开机启动

27“万里”树莓派小车——固定和获取树莓派IP地址

28“万里”树莓派小车——小车组装

29“万里”树莓派小车——直行偏向问题与新控制模式

30.“万里”树莓派小车——第一阶段完成展示(从零开始介绍)

个人签名

玩板看这里:

http://bbs.eeworld.com.cn/elecplay.html

EEWorld测评频道众多好板等你来玩,还可以来频道许愿树许愿说说你想要玩的板子,我们都在努力为大家实现!


回复

5139

帖子

236

资源

管理员


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

查找数据手册?

EEWorld Datasheet 技术支持

最新文章 更多>>
    推荐帖子
    HART® 调制解调器的高精度环路供电式 4mA 至 20mA

    此参考设计为采用 HART® 调制解调器的环路供电型高精度现场(传感器)变送器提供了一种解决方案。此设计使用了部分分立的 4 ...

    传感器电路分析,关于火焰探测器

    这个电路包含两个部分功能,一个是自激产生高压,第二是产生一个负压,VCC为24v,现在主要是这两个电路搞不明白

    说下CC1310开发环境

    一、准备工作 1.sdk版本:simplelink_cc13x0_sdk_1_60_00_21 2.开发工具:IAR(Embedded Workbench 8.0_2)或者CCS(Code ...

    电池测试设备 --- 信号链篇

    Stanley Ho 随着锂电池行业的兴起,电池测试设备的市场也变得庞大,其主要应用于3C电池与动力电池的化成 ...

    Verilog HDL的基础知识.pdf

    Verilog HDL的基础知识.pdf

    【国民技术低功耗系列N32L43x测评】2、RT-Thread移植+LED演示

    本帖最后由 emmnn 于 2022-7-7 11:16 编辑 # 前言 在把官方提供的DEMO工程跑起来后,就可以考虑OS的移植了。恰好在官方 ...

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

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

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

    北京市海淀区知春路23号集成电路设计园量子银座1305 电话:(010)82350740 邮编:100191

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