资讯详情

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-7和12-14的时钟源为84 MHz(pyb.freq()[2] * 2),
			计时器1和8-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			可以是1、2或4。将定时器时钟分频以确定数字滤波器使用的采样时钟。
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])
			获取或设置与通道关联的脉冲宽度百分比。该值是介于0到100之间的数字,
			用于设置脉冲有效的计时器周期的百分比。
			该值可以是整数或浮点数,以提高准确性。例如,值为25表示占空比为25%。

标签: 2oo0欧电阻

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台