K210学习笔记(四):PWM与双线程

今天简单更新一下关于K210的PWM部分和双线程部分吧,串口部分因为俺的usb转TTL丢了(不知道扔哪去了懒得找了重买了一个还在路上)就留着下次更新吧,从明开始就可以进入视觉部分了。先来简单介绍一下PWM吧。

PWM是一种特定的信号输出,其主要区别在频率和占空比(一个周期内高电平所占的时间占总时间的比例)的不同,不同的占空比输出的等效电压是不同的(最直观的感受就是点灯的亮度不同),波形大概可参考上面的图。在我手上的这块开发板(canmv-K210)上集成了一块无源的蜂鸣器。首先我们要知道的是有源蜂鸣器和无源蜂鸣器的区别,有源蜂鸣器一般只需要供电就可以工作,但是无源蜂鸣器除了供电还需要依靠不同频率和占空比来产生不同音调的声音(常用这种蜂鸣器来跑一些音乐的代码)。因此我们这里采用这款无源蜂鸣器来进行本次实验的一部分。

我们再描述一下线程,比较老的单片机(stc89C51或者现在的stc32),还是意法半导体的stm32f1系列(f103),都是单线程的,程序执行就是一个串行,从上到下依次执行,虽然实际看上去好像也可以实现灯一边闪蜂鸣器一边响,但实际上并不能算是同时进行,依旧有先后顺序。而k210是双核的,这就意味着我可以实现并行的思路和代码执行,相互是不影响的。(笔者对线程的理解还是有限就先写到这里,实际上还是很容易出现进程之间相互争抢的现象的。等遇到了会及时更新)

下面就是代码的演示啦,在这里我跟官方的例程还是有区别的,我利用双线程同时实现了LED灯的亮灭循环和蜂鸣器不同声调的响从而更好地加深理解。

import _thread #导入线程模块
import time
from maix import GPIO
from fpioa_manager import fm
from machine import Timer,PWM


#注册IO和构建LED对象
fm.register(35,fm.fpioa.GPIO0)
LED_B=GPIO(GPIO.GPIO0,GPIO.OUT)
#初始化定时器函数
tim=Timer(Timer.TIMER0,Timer.CHANNEL0,mode=Timer.MODE_PWM)
#初始化PWM函数
pwm=PWM(tim,freq=1,duty=50,pin=9)
#定义线程函数
def func_led(name):
    while True:
          LED_B.value(0)
          time.sleep(1)
          LED_B.value(1)
          time.sleep(1)


def func_PWM(name):
    while True:
          pwm.duty(50)
          pwm.freq(500)
          time.sleep(1)
          pwm.freq(700)
          pwm.duty(70)
          time.sleep(1)

_thread.start_new_thread(func_led,("1",))#开启线程1,参数必须为元组
_thread.start_new_thread(func_PWM,("2",))#开启线程2,参数必须为元组

while True:
      pass

如上图,这是用到的构造PWM的函数,来自于machine库(跟Timer一样),pin=9意味着使用io9(本开发板中无源蜂鸣器与io9相连。),同时要注意PWM与定时器之间密不可分的关系,所以在初始化PWM的时候一定要记得初始化定时器,将定时器设置为对应的PWM模式。

至于开启线程利用的是_thread模块的内容,是衍生于python3的内容,详见17.9. _thread — 低级线程 API — Python 3.5.9 文档

关于这方面的内容就到此结束啦,有问题评论区私信皆可,共同学习共同进步。下班!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cointreau97

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值