查看: 4504|回复: 9

[讨论] MBED中的对象定义

[复制链接]
  • TA的每日心情
    开心
    2019-2-14 16:49
  • 签到天数: 296 天

    连续签到: 1 天

    [LV.8]以坛为家I

    241

    主题

    2239

    帖子

    6

    金牌会员

    Rank: 6Rank: 6

    积分
    4473
    最后登录
    2020-4-14
    发表于 2016-9-14 08:10:49 | 显示全部楼层 |阅读模式
    问题如题,在NBED中可以明确看出C++的痕迹——对象、类、属性、方法等,对象是必须的,属性也是必需的,后两者可以选用,取决于对对象的需求。问题是在定义Analog对象——ADC采样上——因为无法生成MBED案例,只好尝试自己从obj开始;查看include文档有3个[我觉得够了]或更多个与此有关:
    AnologIn.h、Analog_api.h、和管脚定义的PeriheralName.h。
    在查看前两个INC文件,其中有:analogin_init(analogin_t *obj, PinName pin);
    初始化adc,其中的*.obj的定义不太明确,是指的那个?遍历obj,找到ADC_SC1_ADCH(x),确实是Analog对象,查手册PinName pin直接给定PTE20。这样此函数为:analogin_init(ADC_SC1_ADCH(0),PTE20);————没有报错,编译通过,好高兴,接着analogin_read(analogin_t *obj)这一句,应该是活的adc16位采样的数值,于是定义:int16_t val0;
    val0=analogin_read(ADC_SC1_ADCH(0);————同样编译通过
    printf("ADC= %5d\n",val0);
    结果查询运行没有反应。实际上在第一次编译通过时在PCCOM口上显示过:无定义管脚名称,但后来就再也不出来了。
    问题是:
    1. 按照常规ADC需要start才会采样一次[可以设置成连续采样——后话],但没有找到adcStart的函数。
    2. 如果以上定义是对的,为什么不出结果。
    顺便说一下,LCD驱显参照GPIO已经正常了,感觉MBED真是太简单了,但是这个ADC让我费了昨晚后来的好几个小时。
    恳切希望指教,先谢谢了。


    回复

    使用道具 举报

  • TA的每日心情
    开心
    2019-2-14 16:49
  • 签到天数: 296 天

    连续签到: 1 天

    [LV.8]以坛为家I

    241

    主题

    2239

    帖子

    6

    金牌会员

    Rank: 6Rank: 6

    积分
    4473
    最后登录
    2020-4-14
     楼主| 发表于 2016-9-14 09:01:46 | 显示全部楼层

    RE: MBED中的对象定义

    单路ADC采样已解决,仔细看了analogin_read_u16(),其中已有ADCInitial,并且在PeriheralName.h定义ADC使用PTB0~3,PTC2这5个口,于是直接:
    val0=analogin_read(ADC_SC1_ADCH(MBED_ANALOGIN4);
    printf("ADC= %5d\n",val0);
    结果从PTB0可以的到15位ADC的数值。但是尝试
    val1=analogin_read(ADC_SC1_ADCH(MBED_ANALOGIN3);
    就报错。这是非常不理解的事。尝试才ADC转换后加延时——无效,因为报错是非INT函数,晕。
    不过可以的到1路ADC也算可以了,在戒指往下实验吧。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2018-7-24 14:23
  • 签到天数: 98 天

    连续签到: 1 天

    [LV.6]常住居民II

    14

    主题

    419

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    2236
    最后登录
    2024-9-19
    发表于 2016-9-14 09:06:01 | 显示全部楼层
    mbed有个AnlogIn.h, 10.png

    从下面图可以看出A0,A1...A5都是可以处理模拟信号的

    导入头文件
    #include "mbed.h"
    定义模拟信号输入引脚,
    AnalogIn temperature(A0);从A0读数据printf("Too hot! (%f)", temperature.read());


    mbed和arduino的底层驱动都是封装好的,直接调用就行

    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2019-2-14 16:49
  • 签到天数: 296 天

    连续签到: 1 天

    [LV.8]以坛为家I

    241

    主题

    2239

    帖子

    6

    金牌会员

    Rank: 6Rank: 6

    积分
    4473
    最后登录
    2020-4-14
     楼主| 发表于 2016-9-14 09:42:45 | 显示全部楼层
    本帖最后由 zhjb1 于 2016-9-14 09:45 编辑
    samplecode 发表于 2016-9-14 09:06
    mbed有个AnlogIn.h,

    从下面图可以看出A0,A1...A5都是可以处理模拟信号的

    谢谢,已经测试成功了。实际上与C++平台一样,当正确的定义了obj之后输入obj名+.会自动弹出类的属性和方法。选用就可以了。与VisaulStudio几乎一样。我定义的是adc0,adc1两个obj,之后与您的方法一样,采回来两路ADC——PTB0,PTB1.而不是手册上的ADC_SE0对应的PTE20...
    再次感谢!
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    35

    主题

    356

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    3261
    最后登录
    2023-6-23
    发表于 2016-9-14 09:42:47 | 显示全部楼层
    不错,楼主V5
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2019-2-14 16:49
  • 签到天数: 296 天

    连续签到: 1 天

    [LV.8]以坛为家I

    241

    主题

    2239

    帖子

    6

    金牌会员

    Rank: 6Rank: 6

    积分
    4473
    最后登录
    2020-4-14
     楼主| 发表于 2016-9-14 11:48:31 | 显示全部楼层
    samplecode 发表于 2016-9-14 09:06
    mbed有个AnlogIn.h,

    从下面图可以看出A0,A1...A5都是可以处理模拟信号的

    您好!
    ADC好像无问题,但在PWM中又有问题了!
    如法炮制,定义PwmOut pwm(D3);
    在下边的输出中printf("pwm: %5d“,pwm.pulsewidth_us(1000));
    就报viod错,求解
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2018-7-24 14:23
  • 签到天数: 98 天

    连续签到: 1 天

    [LV.6]常住居民II

    14

    主题

    419

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    2236
    最后登录
    2024-9-19
    发表于 2016-9-14 12:23:32 | 显示全部楼层
    zhjb1 发表于 2016-9-14 11:48
    您好!
    ADC好像无问题,但在PWM中又有问题了!
    如法炮制,定义PwmOut pwm(D3);

    pwm.pulsewidth_us(1000);是设置脉冲宽度的没有返回值。
    11.png
    float         read ()
    printf("..... %f......\r",pwm.read());
    返回当前输出频宽比设置,一个浮点值,表示当前输出的频宽比销,测量作为一个百分比。返回的值介于0.0 f(代表0%)和1.0 f(表示为100%)。

    void         period (float seconds)
    设置PWM周期,以秒为单位,保持工作周期相同。
    void         pulsewidth (float seconds)
    设置PWM脉冲宽度,以秒为单位,保持相同的周期。


    给的例子,直接赋值的频宽比
    1. #include "mbed.h"

    2. PwmOut led(LED1);

    3. int main() {
    4.     while(1) {
    5.         led = led + 0.01;
    6.         wait(0.2);
    7.         if(led == 1.0) {
    8.             led = 0;
    9.         }
    10.     }
    11. }
    复制代码


    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2019-2-14 16:49
  • 签到天数: 296 天

    连续签到: 1 天

    [LV.8]以坛为家I

    241

    主题

    2239

    帖子

    6

    金牌会员

    Rank: 6Rank: 6

    积分
    4473
    最后登录
    2020-4-14
     楼主| 发表于 2016-9-14 12:53:28 | 显示全部楼层
    samplecode 发表于 2016-9-14 12:23
    pwm.pulsewidth_us(1000);是设置脉冲宽度的没有返回值。

    float         read ()

    您好!我看了里面的代码,为什么只能给浮点数,整形的为什么报错。实际上在许多舵机控制上整形的比浮点的正确可靠。
    谢谢
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2019-2-14 16:49
  • 签到天数: 296 天

    连续签到: 1 天

    [LV.8]以坛为家I

    241

    主题

    2239

    帖子

    6

    金牌会员

    Rank: 6Rank: 6

    积分
    4473
    最后登录
    2020-4-14
     楼主| 发表于 2016-9-14 13:46:37 | 显示全部楼层
    上述案例都看过也没有问题。不明白的是常规PWM设置:先设置时钟[省略]、设置PWM周期[循环周期,比如2mS]、设置脉冲宽度[如果是时间,则是周期的倒数*设定值],只需要程序改变设定值脉宽就改变了,一般周期是固定的。
    我理解的上述是:period是周期,由初始化设定即可;pulsewidth则是设定脉冲宽度。但现在不如人意,要么出不来,要么报错。我也用过float设置[LCD无法显示结果,但printf可以输出结果],也只是在他的led上通过,我自行按照您给的图示的可用于pwm的PTA12-andorid设置为D3,或PTA12结果不报错,但什么也没有——示波器看的是无信号。问题依旧,月亮就圆。?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2019-2-14 16:49
  • 签到天数: 296 天

    连续签到: 1 天

    [LV.8]以坛为家I

    241

    主题

    2239

    帖子

    6

    金牌会员

    Rank: 6Rank: 6

    积分
    4473
    最后登录
    2020-4-14
     楼主| 发表于 2016-9-17 17:47:01 | 显示全部楼层
    此问题已经解决,忘了声明了,Sorry
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-7-21 00:19 , Processed in 0.103541 second(s), 29 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表