打印
[MCU]

为什么要这样进行位操作

[复制链接]
468|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jlyuan|  楼主 | 2019-6-13 22:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
Code of TMS320F28335 CCS4\v120\DSP2833x_examples\eqep_pos_speed\Example_posspeed.c文件中有这么一段是计算机械角度的:
   pos16bval=(unsigned int)EQep1Regs.QPOSCNT;     // capture position once per QA/QB period
      p->theta_raw = pos16bval+ p->cal_angle;        // raw theta = current pos. + ang. offset from QA

   // The following lines calculate p->theta_mech ~= QPOSCNT/mech_scaler [current cnt/(total cnt in 1 rev.)]
   // where mech_scaler = 4000 cnts/revolution
1     tmp = (long)((long)p->theta_raw*(long)p->mech_scaler);   // Q0*Q26 = Q26
2     tmp &= 0x03FFF000;                                       
3     p->theta_mech = (int)(tmp>>11);           // Q26 -> Q15
4     p->theta_mech &= 0x7FFF;   

1~4为什么要这样进行位操作,请解释一下,多谢!

使用特权

评论回复

相关帖子

沙发
zhanghqi| | 2019-6-13 23:04 | 只看该作者

这个肯定是根据计算角度的公式,得到的程序呗

使用特权

评论回复
板凳
wyjie| | 2019-6-13 23:08 | 只看该作者


是啊,首先的知道怎么计算角度的公式啊。

使用特权

评论回复
地板
yszong| | 2019-6-13 23:13 | 只看该作者

是啊,楼主你需要首先知道计算的公式是什么。

使用特权

评论回复
5
dengdc| | 2019-6-13 23:17 | 只看该作者
只有
3     p->theta_mech = (int)(tmp>>11);           // Q26 -> Q15
这里是在移位操作, 是为了调整 Q26 到 Q15 的变换, 要知道为什么, 研究一下 IQ 库.
其他的 -> 操作符只是指针结构的成员操作

使用特权

评论回复
6
jiaxw| | 2019-6-13 23:21 | 只看该作者

p->theta_mech &= 0x7FFF;   // 把theta_mech (-1,1)pu限制在(0,1)pu

使用特权

评论回复
7
lizye| | 2019-6-13 23:24 | 只看该作者

这样是为了便于让其他的程序设计者很方便的看到这个算法实现的全过程的

使用特权

评论回复
8
shimx| | 2019-6-13 23:27 | 只看该作者
这样写的便于理解的,,,程序的最终实现形式就是基于二进制的操作的额

使用特权

评论回复
9
jiaxw| | 2019-6-13 23:30 | 只看该作者

这样位操作的一目了然的,,能看到真实目的

使用特权

评论回复
10
zhenykun| | 2019-6-13 23:35 | 只看该作者

这个其实也没啥的,有些是设计者个人习惯的

使用特权

评论回复
11
jiahy| | 2019-6-13 23:35 | 只看该作者
其实还是不大明白,我再琢磨琢磨吧,多谢了哈,结贴了先

使用特权

评论回复
12
jlyuan|  楼主 | 2019-6-13 23:39 | 只看该作者
嗯,我再好好缕一缕吧,有了好消息及时通知大家,结贴喽

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

880

主题

12030

帖子

4

粉丝