|
难道Timer的回调函数与round数学运算有冲突吗?请高手指教。
[复制链接]
本帖最后由 zzwqw 于 2018-3-28 16:01 编辑
在学习使用ADC时碰到个疑问,求高手解答,具体情况如下:设定PYB Nano 的“X5”(PB8)为PWM模式,外接LED,“X7”(PA7)脚为ADC外接可调电位器,通过调节电位器来控制LED的亮度,如下图:
代码如下:
- from pyb import Pin,Timer,ADC
- tm = Timer(4,freq=100)
- led = tm.channel(3,Timer.PWM,pin=Pin.cpu.B8)
- led_liangdu = led.pulse_width_percent
- adc =ADC(Pin.cpu.A7)
- while True:
- shuzhi = round(100/4095*adc.read())
- led_LD(shuzhi)
- pyb.delay(100)
复制代码
以上代码工作正常,LED的亮度受电位器的控制,可是尝试把循环代码改写成用定时器触发时,却不能正常工作,代码只运行一次就退出了不能连续。
改写后的代码如下:
- from pyb import Pin,Timer,ADC
- tm = Timer(4,freq=100)
- led = tm.channel(3,Timer.PWM,pin=Pin.cpu.B8)
- led_liangdu = led.pulse_width_percent
- adc =ADC(Pin.cpu.A7)
- def tiaoguang(t=0):
- shuzhi = round(100/4095*adc.read()) #取整
-
- led_liangdu(shuzhi)
- print(shuzhi)
- Timer(3,freq=100,callback=tiaoguang())
复制代码
运行结果如下图所示
如果调用定时器语句时的回调函数不加括号,象下面这样
- Timer(3,freq=100,callback=tiaoguang)
复制代码
则会抛出错误,如下图
但是如果不做取整运算,就正常,调用回调函数也不用加括号。
- from pyb import Pin,Timer,ADC
- tm = Timer(4,freq=100)
- led = tm.channel(3,Timer.PWM,pin=Pin.cpu.B8)
- led_liangdu = led.pulse_width_percent
- adc =ADC(Pin.cpu.A7)
- def tiaoguang(t=0):
- #shuzhi = round(100/4095*adc.read()) #取整
- shuzhi = adc.read()
- led_liangdu(shuzhi)
- print(shuzhi)
-
- Timer(3,freq=100,callback=tiaoguang)
复制代码
(为了方便截个图,调低了Timer.freq的值)
这个round运算为什么会造成这样的后果,请高手指导下其中的原由,谢谢。
|
|