近期在做一个交流电机的控制程序,参考TI公司提供的代码库,发现了在f281xpwm.c文件中的一个费解语句,如下:

// Compute the timer period (Q0) from the period modulation input (Q15)
        Tmp = (int32)p->PeriodMax*(int32)p->MfuncPeriod;           // Q15 = Q0*Q15
        MPeriod = (int16)(Tmp>>16) + (int16)(p->PeriodMax>>1);     // Q0 = (Q15->Q0)/2 + (Q0/2)
        EvaRegs.T1PR = MPeriod;

// Compute the compare 1 (Q0) from the PWM 1&2 duty cycle ratio (Q15)
        Tmp = (int32)MPeriod*(int32)p->MfuncC1;                    // Q15 = Q0*Q15
        EvaRegs.CMPR1 = (int16)(Tmp>>16) + (int16)(MPeriod>>1);    // Q0 = (Q15->Q0)/2 + (Q0/2)

// Compute the compare 2 (Q0) from the PWM 3&4 duty cycle ratio (Q15)
        Tmp = (int32)MPeriod*(int32)p->MfuncC2;                   // Q15 = Q0*Q15
        EvaRegs.CMPR2 = (int16)(Tmp>>16) + (int16)(MPeriod>>1);   // Q0 = (Q15->Q0)/2 + (Q0/2)

// Compute the compare 3 (Q0) from the PWM 5&6 duty cycle ratio (Q15)
        Tmp = (int32)MPeriod*(int32)p->MfuncC3;                   // Q15 = Q0*Q15
        EvaRegs.CMPR3 = (int16)(Tmp>>16) + (int16)(MPeriod>>1);   // Q0 = (Q15->Q0)/2 + (Q0/2)

蓝色部分的语句让我很费解,经过查找资料和自己的理解,总算看明白了。现解释如下:

Tmp = (int32)p->PeriodMax*(int32)p->MfuncPeriod;           // Q15 = Q0*Q15
MfuncPeriod的范围是-1~1(Q15)格式, PeriodMax 是一个较大的整数,我们假设是3000,那么Tmp的范围应该是
-3000~3000,但是PMW的周期必须为正整数,即0到 PeriodMax,怎么把-3000~3000转换成0~ PeriodMax呢?
MPeriod = (int16)(Tmp>>16) + (int16)(p->PeriodMax>>1);     // Q0 = (Q15->Q0)/2 + (Q0/2)
这条语句就是实现上述功能的。Tmp首先除于2,范围变为-1500~1500,然后在偏移1500(+PeriodMax>>1),此时范围是0~3000,实现了上述转换。
 EvaRegs.CMPR1 = (int16)(Tmp>>16) + (int16)(MPeriod>>1);    // Q0 = (Q15->Q0)/2 + (Q0/2)
EvaRegs.CMPR2 = (int16)(Tmp>>16) + (int16)(MPeriod>>1);   // Q0 = (Q15->Q0)/2 + (Q0/2)
EvaRegs.CMPR3 = (int16)(Tmp>>16) + (int16)(MPeriod>>1);   // Q0 = (Q15->Q0)/2 + (Q0/2)
这三条语句,与上面的理解类似,但是要注意,此时的 PWM 1&2 duty cycle ratio 也就是MfuncC1是经过处理的一个变量,我们知道占空比是不能出现负数的,但是此时的MfuncC1的范围为什么是-1~1呢?这个和SVGEN_DQ的实现有关,在其源代码的结束,有三条语句,
// Convert the unsigned GLOBAL_Q format (ranged (0,1)) -> signed GLOBAL_Q format (ranged (-1,1))
    v->Ta = _IQmpy(_IQ(2.0),(v->Ta-_IQ(0.5)));
    v->Tb = _IQmpy(_IQ(2.0),(v->Tb-_IQ(0.5)));
    v->Tc = _IQmpy(_IQ(2.0),(v->Tc-_IQ(0.5)));
这三条语句实现了占空比由(0,1)到(-1,-1)的转换。
此时,可以总结下该问题了
1,Tmp = (int32)p->PeriodMax*(int32)p->MfuncPeriod;           // Q15 = Q0*Q15
该条语句的作用,PWM周期PeriodMax乘以其占空比(低电平占周期的百分数),得到比较寄存器的值,但因为此时的占空比经过范围变换处理,所以还不是真正的比较寄存器的值
2,EvaRegs.CMPR1 = (int16)(Tmp>>16) + (int16)(MPeriod>>1);    // Q0 = (Q15->Q0)/2 + (Q0/2)
把上条语句得到的值Tmp除以2,实现占空比由(-1,1)到(-0.5,0,5)的还原,然后右移15位,也就是取整,将该数从Q15格式转换成Q0格式,然后加上0.5(对应MPeriod>>1)的偏移,把占空比还原到(0,1),此时的结果就是比较寄存器的值。
举个例子,如果PeriodMax是3000,MfuncPeriod的范围是(-1,1),Tmp的范围是(-3000,3000),然后我们把Tmp右移1位,此时Tmp的范围是(-1500,1500),然后加上Mperiod右移1位的值,即加上1500,此时Tmp的范围变为(0,3000),得到了比较寄存器的值

TI电机控制库 SVGEN_DQ and FC_PWM_DRV问题的一些理解相关推荐

  1. DSP28335/377学习-controlSUITE安装及TI电机控制例程

    1 软件安装及介绍 controlSUITE是Ti为C2000开发者提供的资料库和参考工具包.在这里面对C2000每个型号都有对应的样例.手册和设计指导.还有各种开发板平台的原理图.PCB图和使用说明 ...

  2. stm32捕获占空比_【电机控制】六步法驱动BLDC电机,使用硬件COM事件,STM32+CUBEMX(HAL库)配置...

    现在我也只能说是电机入门,但是想要把电机作为终身事业,从有霍尔到无霍尔,从方波到正弦波,现在把其中的一些知识点分享出来,因为电机控制其实的资料比较难找的,前人栽树,后人乘凉,如果我有什么错误,在知乎上 ...

  3. 【电机控制】六步法驱动BLDC电机,使用硬件COM事件,STM32+CUBEMX(HAL库)配置

    已经做了半年的BLDC驱动器了,目前是做到了电流转速双闭环,期间遇到了很多很多问题,一个是资料难找,再加上公司要求使用CUBEMX,本身HAL库的资料也难找,难上加难啊,可能是用CUBEMX做出来的大 ...

  4. 【STM32F4系列】【HAL库】电机控制(转速和角度)(PID实战1)

    文章目录 项目目标 硬件搭建 HAL初始化 定时器 PWM 编码器 定时器中断 串口 基础驱动 获取速度 获取角度 电机控制 PID 速度环 速度环设计 速度环调参 调试顺序 P(比例) I(积分) ...

  5. 电机控制编程的数学运算优化方案

    引言   电机控制应用设计传统上采用微控制器(MCU)或数字信号处理器(DSP)来运行电机控制算法.在研究永磁同步电机(PMSM)矢量控制的时候,坐标变换的三角函数运算.观测器的迭代.锁相环的鉴相环节 ...

  6. 浮点运算单元FPU能给电机控制带来什么?

    编者按:在计算领域,例如三角函数以及时域频域变换通常会用到浮点运算.当CPU执行一个需要浮点数运算的程序时,有三种方式可以执行:软件仿真器(浮点运算函数库).附加浮点运算器和集成浮点运算单元.在控制应 ...

  7. fpu测试_浮点运算单元FPU能给电机控制带来什么?

    编者按:在计算领域,例如三角函数以及时域频域变换通常会用到浮点运算.当CPU执行一个需要浮点数运算的程序时,有三种方式可以执行:软件仿真器(浮点运算函数库).附加浮点运算器和集成浮点运算单元.在控制应 ...

  8. 电机控制-硬件系统设计

    1.电机控制的结构框图 电机控制的结构框图如图1所示.一个电机系统包括四个大部分:被控对象.控制器.执行器.反馈,硬件上分别对应电机.MCU.驱动电路.信号调理电路,这样就构成了一套反馈控制系统 一套 ...

  9. 三大电机控制方案之DSP篇(1):TMS320F28335

    三大电机控制方案之DSP篇(1):TMS320F28335 简介: TMS320F28335数字信号处理器是属于C2000系列的一款浮点DSP控制器.与以往的定点DSP相比,该器件的精度高,成本低, ...

最新文章

  1. springboot创建parent_Spring Boot 开篇:快速入门
  2. 9 个基于JavaScript 和 CSS 的 Web 图表框架
  3. python程序调试题_关于python程序调试问题,一个文件计算的问题
  4. 30 个很棒的 PHP 开源 CMS 内容管理系统
  5. js节流函数和js防止重复提交的N种方法
  6. Ubuntu 16.04 LTS与windows双系统时间同步解决方法
  7. C++的多态原理和实现
  8. 二、JS运算符、NaN
  9. Spring Boot核心注解讲解
  10. 重装系统后如何配置网络
  11. 记录4 最近贺题时做的题 cf611e,cf873f,cf264d,cf1320d,cf1438c,hdu6833,hdu3602,cf1187g,cf1051e,cf925d,cf840c,etc
  12. MySQL总结4_多表查询
  13. 贪心算法基础之活动时间安排(一)安排 51nod 贪心教程
  14. 评定职称/积分落户,原来软考证书含金量这么大!
  15. Android开发:微信应用签名如何获取
  16. EtherCAT和CANopen之间有什么关系?
  17. 2080 Calendar
  18. 论文阅读4:ShiDianNao
  19. Windows Mobile5.0与Windows Mobile6.0对比评测
  20. scratch实现流畅动画/连贯动作/自制素材/少儿编程scratch教研教案课件课程素材脚本

热门文章

  1. linux 内核rt,给linux内核打实时补丁preempt_rt
  2. 电信光纤入户 itv 路由器设置
  3. SSL,TLS协议与OpenSSL 心血heartbleed漏洞之伤
  4. 下一站云计算+,智慧地铁未来可期
  5. n76e003引脚图_N76E003的学习之路(二)
  6. SDCC+xmake环境尝试单片机N76E003点灯
  7. 139.单词拆分(java)
  8. Hololens2学习之路——从零开始部署项目到Hololens2(有线版)
  9. Java枚举类型代码解析
  10. 【PCIe 6.0】PCIe 6.0 新特性 - L0p 详解