[TPYBoard - Micropython之会python就能做硬件 5] 学习使用重力传感器及PWM

简介: 转载请注明:@小五义 http://www.cnblogs.com/xiaowuyi            欢迎加入讨论群 64770604   一、实验器材 1、TPYboard V102板  一块 2、LED灯   一个 3、1602 屏 一块   二、重力传感器         TPYboard与pyboard一样,本身带一个重力传感器。

转载请注明:@小五义 http://www.cnblogs.com/xiaowuyi            欢迎加入讨论群 64770604

 

一、实验器材

1TPYboard V102板  一块

2LED灯   一个

31602 屏 一块

 

二、重力传感器

        TPYboardpyboard一样,本身带一个重力传感器。该传感器能够感知到加速的变化加速力就是当物体在加速过程中作用在物体上的力,比如晃动、跌落、上升、下降等各种移动变化都能被转化为电信号

       TPYBoard使用的是MMA7660重力传感器,主要用于检测XYZ三个轴所受到的加速度大小。检测范围是-1.5g ~ 1.5g,其中,g为一个重力加速度。

 

 

 

 

 

三、重力传感器的使用

 这里,我们做一个简单的实验,利用重力传感器,来判断tpyboard板子的旋转方向。当tpyboard向右转动时,亮led2(板载),灭led3,当向左转动时,亮led3(板载),灭led2

具体代码如下:

# main.py -- put your code here!
import pyb

accel = pyb.Accel()
while 1:
    x = accel.x()
    y = accel.y()
    z = accel.z()
    print(x,y,z)
    if x==4 :
        pyb.LED(2).off()
        pyb.LED(3).off()
    if x>4 :
        pyb.LED(2).on()
        pyb.LED(3).off()
    if x<4:
        pyb.LED(3).on()
        pyb.LED(2).off()

实现效果:

 

四、利用重力传感器控制LED亮度

1、什么是PWM

   PWM:脉冲宽度调制是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。PWM基本原理是控制方式就是对逆变电路开关器件的通断进行控制,使输出端得到一系列幅值相等的脉冲,用这些脉冲来代替正弦波或所需要的波形。也就是在输出波形的半个周期中产生多个脉冲,使各脉冲的等值电压为正弦波形,所获得的输出平滑且低次谐波少。按一定的规则对各脉冲的宽度进行调制,即可改变逆变电路输出电压的大小,也可改变输出频率。

  例如,把正弦半波波形分成N等份,就可把正弦半波看成由N个彼此相连的脉冲所组成的波形。这些脉冲宽度相等,都等于 ∏/n ,但幅值不等,且脉冲顶部不是水平直线,而是曲线,各脉冲的幅值按正弦规律变化。如果把上述脉冲序列用同样数量的等幅而不等宽的矩形脉冲序列代替,使矩形脉冲的中点和相应正弦等分的中点重合,且使矩形脉冲和相应正弦部分面积(即冲量)相等,就得到一组脉冲序列,这就是PWM波形。可以看出,各脉冲宽度是按正弦规律变化的。根据冲量相等效果相同的原理,PWM波形和正弦半波是等效的。对于正弦的负半周,也可以用同样的方法得到PWM波形。在PWM波形中,各脉冲的幅值是相等的,要改变等效输出正弦波的幅值时,只要按同一比例系数改变各脉冲的宽度即可,因此在交-直-交变频器中,PWM逆变电路输出的脉冲电压就是直流侧电压的幅值。根据上述原理,在给出了正弦波频率,幅值和半个周期内的脉冲数后,PWM波形各脉冲的宽度和间隔就可以准确计算出来。按照计算结果控制电路中各开关器件的通断,就可以得到所需要的PWM波形。

2、利用PWM调节LED灯亮度

   Tpyboard板子与pyboard是一致的,其pwmTimer的一种工作模式,它需要使用到TimerPin两个库。这里来看一下如何控制LED3(板载)的亮度。

代码:

from pyb import Pin, Timer

tm2=Timer(2, freq=100)
led3=tm2.channel(1, Timer.PWM, pin=Pin.cpu.A15)
led3.pulse_width_percent(10)

此时LED3的亮度较暗,见图:

将上面代码中的pulse_width_percent=10改为100,再来看一下效果,会发现LED3亮度明显增强。

代码:

from pyb import Pin, Timer

tm2=Timer(2, freq=100)
led3=tm2.channel(1, Timer.PWM, pin=Pin.cpu.A15)
led3.pulse_width_percent(100)

当然,也可以尝试改一下freq来试试,这样看是什么 效果?

 

3、micropython的标准库Timer

 (1)class pyb.Timer(id, ...):创建定时器对象,id范围是[1..14]

 (2)timer.init(*, freq, prescaler, period):定时器初始化。

 (3)freq:频率。

 (4)prescaler,预分频,[0-0xffff],定时器频率是系统时钟除以(prescaler + 1)。定时器2-712-14最高频率是84MHz,定时器18-11是   >168MHz

 (5)peroid,周期值(ARR)。定时器1/3/4/6-15[0-0xffff],定时器25[0-0x3fffffff]

 (6)mode,计数模式

   (7) Timer.UP - 0 ARR (默认)

    (8) Timer.DOWN - ARR 0.

    (9)Timer.CENTER - 0 ARR,然后到 0.

    (10)div,用于数值滤波器采样时钟,范围是1/2/4

    (11)callback,定义回调函数,和Timer.callback()功能相同

    (12)deadtime,死区时间,通道切换时的停止时间(两个通道都不会工作)。范围是[0..1008],它有如下限制: 

         0-128 in steps of 1.

        128-256 in steps of 2,

          256-512 in steps of 8,

        512-1008 in steps of 16

     deadtime的测量是用source_freq 除以 div,它只对定时器1-8有效。

   (13) timer.deinit(): 禁止定时器,禁用回调函数,禁用任何定时器通道

   (14) timer.callback(fun): 设置定时器回调函数

   (15) timer.channel(channel, mode, ...):设置定时器通道

          -channel,定时器通道号

          -mode,模式

          -Timer.PWMPWM模式(高电平方式)

          -Timer.PWM_INVERTEDPWM模式(反相方式)

          -Timer.OC_TIMING,不驱动GPIO

          -Timer.OC_ACTIVE,比较匹配,高电平输出

          -Timer.OC_INACTIVE,比较匹配,低电平输出

          -Timer.OC_TOGGLE,比较匹配,翻转输出

          -Timer.OC_FORCED_ACTIVE,强制高,忽略比较匹配

          -Timer.OC_FORCED_INACTIVE,强制低,忽略比较匹配

          -Timer.IC,输入扑捉模式

          -Timer.ENC_A,编码模式,仅在CH1改变时修改计数器

          -Timer.ENC_B,编码模式,仅在CH2改变时修改计数器

          -callback,每个通道的回调函数

          -pin,驱动GPIO,可以是None

    Timer.PWM 模式下的参数

         -pulse_width,脉冲宽度

         -pulse_width_percent,百分比计算的占空比

    Timer.OC 模式下的参数

         -compare,比较匹配寄存器初始值

          -polarity,极性

          -Timer.HIGH,输出高

          -Timer.LOW,输出低

    Timer.IC 模式下的参数(捕捉模式只有在主通道有效)

          -polarity

          -Timer.RISING,上升沿捕捉

          -Timer.FALLING,下降沿捕捉

          -Timer.BOTH,上升下降沿同时捕捉

    Timer.ENC 模式:

          -需要配置两个Pin

          .使用 timer.counter() 方法读取编码值

          .只在CH1CH2上工作(CH1NCH2N不工作)

          .编码模式时忽略通道号

 

 (16) timer.counter([value]): 设置或获取定时器计数值

 (17) timer.freq([value]):设置或获取定时器频率

 (18) timer.period([value]):设置或获取定时器周期

 (19) timer.prescaler([value]):设置或获取定时器预分频

 (20) timer.source_freq(): 获取定时器源频率(无预分频)

 

4、利用重力传感器控制LED亮度

 

  这里我们选用非板载LED,将一个LED接到X1A0)引脚,然后当板子向右倾斜时,LED越来越亮,当板子向左倾斜时,LED越来越暗。

LED接在了A0口,具体代码如下:

 

 

# main.py -- put your code here!
from pyb import Pin, Timer

tm2=Timer(2, freq=200)
led3=tm2.channel(1, Timer.PWM, pin=Pin.cpu.A0)
accel = pyb.Accel()
while 1:
    x = accel.x()
    print(x)
led3.pulse_width_percent(x*5)

 

  实际效果:

 

 

 

目录
相关文章
|
29天前
|
机器学习/深度学习 Python
堆叠集成策略的原理、实现方法及Python应用。堆叠通过多层模型组合,先用不同基础模型生成预测,再用元学习器整合这些预测,提升模型性能
本文深入探讨了堆叠集成策略的原理、实现方法及Python应用。堆叠通过多层模型组合,先用不同基础模型生成预测,再用元学习器整合这些预测,提升模型性能。文章详细介绍了堆叠的实现步骤,包括数据准备、基础模型训练、新训练集构建及元学习器训练,并讨论了其优缺点。
49 3
|
9天前
|
Python 容器
Python学习的自我理解和想法(9)
这是我在B站跟随千锋教育学习Python的第9天,主要学习了赋值、浅拷贝和深拷贝的概念及其底层逻辑。由于开学时间紧张,内容较为简略,但希望能帮助理解这些重要概念。赋值是创建引用,浅拷贝创建新容器但元素仍引用原对象,深拷贝则创建完全独立的新对象。希望对大家有所帮助,欢迎讨论。
|
11天前
|
存储 索引 Python
Python学习的自我理解和想法(6)
这是我在B站千锋教育学习Python的第6天笔记,主要学习了字典的使用方法,包括字典的基本概念、访问、修改、添加、删除元素,以及获取字典信息、遍历字典和合并字典等内容。开学后时间有限,内容较为简略,敬请谅解。
|
15天前
|
存储 程序员 Python
Python学习的自我理解和想法(2)
今日学习Python第二天,重点掌握字符串操作。内容涵盖字符串介绍、切片、长度统计、子串计数、大小写转换及查找位置等。通过B站黑马程序员课程跟随老师实践,非原创代码,旨在巩固基础知识与技能。
|
14天前
|
程序员 Python
Python学习的自我理解和想法(3)
这是学习Python第三天的内容总结,主要围绕字符串操作展开,包括字符串的提取、分割、合并、替换、判断、编码及格式化输出等,通过B站黑马程序员课程跟随老师实践,非原创代码。
|
11天前
|
Python
Python学习的自我理解和想法(7)
学的是b站的课程(千锋教育),跟老师写程序,不是自创的代码! 今天是学Python的第七天,学的内容是集合。开学了,时间不多,写得不多,见谅。
|
10天前
|
存储 安全 索引
Python学习的自我理解和想法(8)
这是我在B站千锋教育学习Python的第8天,主要内容是元组。元组是一种不可变的序列数据类型,用于存储一组有序的元素。本文介绍了元组的基本操作,包括创建、访问、合并、切片、遍历等,并总结了元组的主要特点,如不可变性、有序性和可作为字典的键。由于开学时间紧张,内容较为简略,望见谅。
|
11天前
|
存储 索引 Python
Python学习的自我理解和想法(4)
今天是学习Python的第四天,主要学习了列表。列表是一种可变序列类型,可以存储任意类型的元素,支持索引和切片操作,并且有丰富的内置方法。主要内容包括列表的入门、关键要点、遍历、合并、判断元素是否存在、切片、添加和删除元素等。通过这些知识点,可以更好地理解和应用列表这一强大的数据结构。
|
11天前
|
索引 Python
Python学习的自我理解和想法(5)
这是我在B站千锋教育学习Python的第五天笔记,主要内容包括列表的操作,如排序(`sort()`、``sorted()``)、翻转(`reverse()`)、获取长度(`len()`)、最大最小值(`max()`、``min()``)、索引(`index()`)、嵌套列表和列表生成(`range`、列表生成式)。通过这些操作,可以更高效地处理数据。希望对大家有所帮助!
|
17天前
|
安全 程序员 Python
Python学习的自我理解和想法(1)
本篇博客记录了作者跟随B站“黑马程序员”课程学习Python的第一天心得,涵盖了`print()`、`input()`、`if...else`语句、三目运算符以及`for`和`while`循环的基础知识。通过实际编写代码,作者逐步理解并掌握了这些基本概念,为后续深入学习打下了良好基础。文中还特别强调了循环语句的重要性及其应用技巧。