pyboard : 引脚,计时器,舵机转起来

引脚

控制器管脚(PIN)

集成电路芯片就是板子中间那个黑色片片。。四周都是引脚,别看引脚多,很多都是接地啊解电源啊之类的,用的上的也就几个。

芯片内部装有控制器等逻辑电路,接受引脚上的高低电平(1/0),经过内部控制器将高低电压加到外部引脚来控制外部设备。

板子上的洞洞都使用 pyb.Pin.board.Name 预定义了,引脚图中对应的cpu name 使用 pyb.Pin.cpu.Name ,对于CPU引脚,名称是端口字母,后跟引脚号pyb.Pin.board.X1 and pyb.Pin.cpu.A0 这俩一样的。

也可以使用字符串g = pyb.Pin('X1', pyb.Pin.OUT_PP)

用户也可以自定义pyb.Pin.dict({‘lalala': pyb.Pin.cpu.A0}) 查询映射pin=pyb.Pin('lalala')

用户可以用自己的映射函数

def MyMapper(pin_name):
   if pin_name == "LeftMotorDir":
       return pyb.Pin.cpu.A0

pyb.Pin.mapper(MyMapper)

这样,如果你调用 pyb.Pin(“LeftMotorDir”, pyb.Pin.OUT_PP) then “LeftMotorDir” 就会直接传递给你的映射函数。

当引脚有Pin.PULL_UP or Pin.PULL_DOWN 模式时,这个引脚就有有效的40欧姆电阻,分别将其拉至3V3 或 GND(除了 Y5 引脚,他有11000 欧姆的电阻)

class pyb.Pin(id,,,,,)
创建一个id 的 Pin对象,如果给了其他参数,就用来初始化引脚,详见pin.init()

classmethod Pin.debug(bool) 获得或设置调试状态
			Pin.dict( dict ) 获得或设置引脚映射字典
			Pin.mapper( func) 设置或获得映射函数
			
method Pin.init(mode,pull=Pin.PULL_NONE,af=-1) 初始化引脚
	mode:Pin.IN 配置输入引脚
		  Pin.OUT_PP 通过推免模式控制配置输出引脚
		  Pin.OUT_OO 通过开漏模式控制输出引脚
		  Pin.AF_PP 配置引脚为备用功能,推挽
		  Pin.AF_OO 配置引脚为备用功能,开漏
		  Pin.ANALOG 配置引脚为模拟
		  
	pull: Pin.PULL_NONE -没有上拉或下拉电阻;
		  Pin.PULL_UP -启用上拉电阻;
		   Pin.PULL_DOWN -启用下拉电阻。
	当mode为Pin.AF_PP或时Pin.AF_OD,则af可以是与引脚关联的替代功能之一的索引或名称。

Pin.value([value])
获得引脚的电平,没有参数就获得这个引脚的电平(0/1),给了值就设置引脚的电平,值可以时转换为布尔值的,True就是高电平。

Pin.mode()返回的数字与init函数的mode对应/name()/names()(加上了cpu名)/pin()引脚数字/port()/pull()返回的数字与init函数的pull对应

class PinAF -- 引脚替代功能

每个引脚都有多个功能嘛(GPIO I2C SDA等),每个PINAF对象代表一个引脚的特定功能。
x3 = pyb.Pin.board.X3
x3_af = x3.af_list()   # 返回此引脚可用的备用功能数组。

x3_af 就是一个PinAF对象数组,这些对象在引脚X3上可用,[Pin.AF1_TIM2,Pin.AF2_TIM5,Pin.AF3_TIM9,Pin.AF7_USART2]看看引脚图

pin = pyb.Pin(pyb.Pin.board.X3, mode=pyb.Pin.AF_PP, af=pyb.Pin.AF1_TIM2) # 配置成TIM2_CH3
pin = pyb.Pin(pyb.Pin.board.X3, mode=pyb.Pin.AF_PP, af=1)  # 一样

pinaf.index()/name()/reg() 寄存器地址TIM2_CH3,则将返回stm.TIM2

脑补链接

对于GPIO的模式的设置,在不考虑是否需要额外的上拉电阻的情况下,是设置为open-drain还是push-pull,说到底,还是个权衡的问题:

如果你想要电平转换速度快的话,那么就选push-pull,但是缺点是功耗相对会大些。

如果你想要功耗低,且同时具有“线与”的功能,那么就用open-drain的模式。(同时注意GPIO硬件模块内部是否有上拉电阻,如果没有,需要硬件电路上添加额外的上拉电阻)

正所谓,转换速度与功耗,是鱼与熊掌,二则不可兼得焉。

# 按下USR 就亮灯。。。
from pyb import Pin
#将 LED(4)-"B4"配置成推挽输出模式
p_out=Pin('B4',Pin.OUT_PP)
#将 USR 按键-"X17"配置为输入方式
p_in = Pin('X17', Pin.IN, Pin.PULL_UP)
while True:
    if p_in.value() == 0:  # USR 被按下接地
        p_out.high()  # 点亮 LED(4)蓝灯
    else:
        p_out.low()  # 关闭 LED(4)蓝灯

舵机转起来

不得不说Micropython的资料太少太少了。。。。

import pyb,time      # 这个简单,,但就是迷惑。。找了很多资料都是周期 20ms 高电平2.5ms 转多少多少。。
x=pyb.Pin('X1',pyb.Pin.OUT_PP)         # 到这就不行了,,就得用 25ms ,,作为一个萌新我真是太难了。。。
while 1:
    x.high()
    pyb.udelay(24200)
    x.low()
    pyb.delay(300)



# 照着文档的LED褪色写的。。。。。
from pyb import Timer,Servo
from time import sleep

# 舵机使用计时器5的通道1,
tim = pyb.Timer(5, freq=100)       # 试了一下,,跟这个频率没关系。。。
tchannel = tim.channel(1, Timer.PWM, pin=pyb.Pin.board.X1, pulse_width=0)

max_width = 2420
min_width = 640

wstep = 300
cur_width = min_width

while True:
  tchannel.pulse_width(cur_width)
  sleep(0.01)
  cur_width += wstep
  if cur_width > max_width:
    cur_width = min_width

class Timer 控制内部计时器

class pyb.Timer(id ,,,)
	构造给定id 的计时器对象,其他参数作为初始化,id 1- 14

Timer.init(\*,freq,prescaler,period,mode=Time.UP,div=1,callback=None,deadtime=0)
	初始化计时器,初始化必须通过频率(HZ)或分频和周期。
tim.init(freq=100)                  # 100Hz触发一次
tim.init(prescaler=83, period=999)  # 直接设置分频和周期
freq: 		指定计时器的周期性频率。
prescaler:	0-0xffff 加载到计时器的预分频器寄存(PSC)的值。定时器时钟源除(预分频器+1)得到定时器时钟。
			计时器2-712-14的时钟源为84 MHz(pyb.freq()[2] * 2),
			计时器18-11的时钟源为168 MHz(pyb.freq()[ 3] * 2)。
period		[0-0xffff] for timers 1, 3, 4, and 6-15. [0-0x3fffffff] for timers 2 & 5
			加载到自动重载寄存器(ARR)中的值,决定计时器的周期,
mode		Timer.UP	配置计时器从0-ARR计数,默认
			Timer.DOWN	配置计时器从ARR-0计数
			Timer.CENTER 将计时器配置为从0到ARR计数,然后递减至0。
div			可以是124。将定时器时钟分频以确定数字滤波器使用的采样时钟。
callback	Timer.callback()

Timer.deinit()			取消计时器的初始化,禁止回调,禁止所用通道回调,停止计时器并禁用计时器外设

Timer.callback(fun)		计时器触发时调用的函数,fun被传递了一个参数,计时器对象,如果fun is None,就禁用回调

Time.channel(channel,mode....)		如果仅传递通道,则返回之前初始化的通道对象(如果没有就返回None)
									否则就初始化一个 TiemChannel 对象并返回
									每个通道都可以配置来执行PWM,输出比较或输入捕获,所有通道共享同一计时器
									
	mode:		Timer.PWM	将定时器配置为PWM模式(高电平有效)
				Timer.PWM_INVERTED 	将定时器配置为PWM模式(低电平有效)。
					
	callback	TimerChannel.callback()

	pin		None (the default) or a Pin object, 如果是Pin对象,为此计时器通道配置对应引脚的备用功能,
			如果这个引脚不支持此计时器的任何替代功能,就报错

	Timer.PWM模式的关键字参数:
			pulse_width -确定要使用的初始脉冲宽度值。
			pulse_width_percent -确定要使用的初始脉冲宽度百分比。
			
PWM的一个栗子:
timer = pyb.Timer(2, freq=1000)
ch2 = timer.channel(2, pyb.Timer.PWM, pin=pyb.Pin.board.X2, pulse_width=8000)
ch3 = timer.channel(3, pyb.Timer.PWM, pin=pyb.Pin.board.X3, pulse_width=16000)


Timer.coounter(value)			获得或设置计时器计数器

Time.freq(value) 				获得或设置计时器频率(或者分频周期)

Timer.period(value) / Timer.prescaler([value])

Timer.source_freq()				获取计时器源的频率。


class TimerChannel			设置计时器的通道
							计时器通道用于使用计时器生成/捕获信号。使用Timer.channel()方法创建TimerChannel对象。

timerchannel.callback(fun)		回调函数

timerchannel.pulse_width([value])
			获取或设置与通道关联的脉冲宽度值。pulse_width是通道处于PWM模式时要使用的逻辑名称。
			在边缘对齐模式下,period+1 的脉冲宽度对应的占空比为100%;
			在中心对齐模式下,period 的脉冲宽度对应的占空比为100%

timerchannel.pulse_width_percent([value])
			获取或设置与通道关联的脉冲宽度百分比。该值是介于0100之间的数字,
			用于设置脉冲有效的计时器周期的百分比。
			该值可以是整数或浮点数,以提高准确性。例如,值为25表示占空比为25%。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值