[讨论] 使用mbed下载到STM32 Nucleo板子上现象不对

hjl240   2014-11-27 21:15 楼主
导入了一个官方的例程,程序如下:
  1. #include "mbed.h"

  2. AnalogIn analog_value(A0);

  3. DigitalOut myled(LED1);

  4. // Calculate the corresponding acquisition measure for a given value in mV
  5. #define MV(x) ((0xFFF*x)/3300)

  6. int main() {
  7.     while(1) {      
  8.         uint16_t meas = analog_value.read_u16(); // Converts and read the analog input value
  9.         if (meas > MV(1000)) { // If the value is greater than 1000 mV toggle the LED
  10.           myled = !myled;
  11.         }
  12.         wait(0.2); // 200 ms
  13.     }
  14. }
程序的现象理应当是当输入电压超过1000mV时,,led不断翻转闪烁,

可是实际现象是:只有把A0接地,led就不闪烁,当A0引脚悬空或者有电压输入,led都会闪烁,输入电压小于1000mV,led也会闪烁,,,很奇怪,,,哪里出了问题?




欢迎关注:JL单片机

回复评论 (8)

哪一个Nucleo板子?
点赞  2014-11-27 21:19
引用: dcexpert 发表于 2014-11-27 21:19
哪一个Nucleo板子?
STM32L053R8
欢迎关注:JL单片机
点赞  2014-11-27 21:33
注意到你使用的是read_u16函数啊,它的返回值是[0x0, 0xFFFF]。使用read函数就可以得到0-1之间的浮点数。

Mbed的函数,和我们习惯是有些区别的,它不是读取ADC的寄存器并直接返回的。同样PWM、延时等也是这样。
点赞  2014-11-27 22:44
因此,你的测试程序可以修改一下: float meas = analog_value.read(); // Converts and read the analog input value if (meas > 1000f/3300)) { // If the value is greater than 1000 mV toggle the LED myled = !myled; } 或者 #define MV(x) ((0xFFFFL*x)/3300) uint16_t meas = analog_value.read_u16(); // Converts and read the analog input value if (meas > MV(1000))) { // If the value is greater than 1000 mV toggle the LED myled = !myled; } 本帖最后由 dcexpert 于 2014-11-27 23:05 编辑
点赞  2014-11-27 22:49
引用: dcexpert 发表于 2014-11-27 22:49 因此,你的测试程序可以修改一下: float meas = analog_value.read(); // Converts and read t ...
上面贴的程序不是我写的,官方给的例程,,,,,我就下载进去验证一下,,结果出现现象不对,,,我用串口输出这个语句
  1. uint16_t meas = analog_value.read_u16();
中的meas值,发现最大值可以到65535,,,问题又来了,,MCU内部AD不是12位的么,怎么可能出现65535,,,,不知道是我哪里搞错了还是官方的mbed软件中的函数库确实有bug。。。。 我又把下面程序下载进MCU,发现现象就对了,,,
  1. float meas = analog_value.read(); // Converts and read the analog input value
  2. if (meas > 1000f/3300)) { // If the value is greater than 1000 mV toggle the LED
  3. myled = !myled;
  4. }
是analog_value.read_u16();这个函数有问题么。。。。。。 本帖最后由 hjl240 于 2014-11-28 15:39 编辑
欢迎关注:JL单片机
点赞  2014-11-28 15:28
MBed估计是为了统一,所以将AD的read_u16()函数读取数据换算成16位的,实际值就需要自己在进行换算。如果是浮点数,范围就是[0..1],这样可能更符合MBed的风格。
点赞  2014-11-28 21:37
nucleoL053R8 AnalogIn函数有bug吧,我用了后会直接卡住,也看很多人在mbed上反馈了但现在没见解决呢
点赞  2015-3-11 02:28
MBED上A0~A5口的外部中断也有BUG
点赞  2016-4-1 16:12
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复