This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CCS/RM48L952:CCS/RM48L952

Guru**** 2606725 points
Other Parts Discussed in Thread: HALCOGEN

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/738857/ccs-rm48l952-ccs-rm48l952

器件型号:RM48L952
主题中讨论的其他器件:HALCOGEN

工具/软件:Code Composer Studio

您好!

我是一个新手。 我打算使用 RM48 Hercules 开发套件(HDK)驱动两个直流电机、并在 CCS 中显示它们的 RPM。 通过使用 Halcogen 和 Code Composer、我能够使用 HET1驱动器生成具有不同占空比的 PWM、从而轻松运行两个电机(感谢 T.I 提供的示例)。 但是、我很困惑如何将每个电机的转速计信号转换为 RPM 并显示它。 我在网上看到了类似的例子,试图让我的工作,但都没有结果。

这就是我到目前为止所做的工作:

已启用 HET1驱动程序

在 PWM 0-7选项卡中、为输出引脚9和10启用 PWM。 引脚9的占空比为60%、引脚10的占空比为20%

在引脚8 - 15选项卡中、启用位9和10的输出方向

以根据转速计信号计算两个电机的 RPM

 已启用 GIO 驱动程序

打开 GIO 选项卡、端口 A。选择 GIOA[0]和 GIOA[1]

使能位0和位1中断、为位0和位1选择下降沿中断  

默认情况下、位0和位1为输入

使能位0和位1上拉  

CCS 中使用的代码

/*用户代码开始(0)*/
#include "het.h"
#include "Gio.h"
#include "important .h"
#include
/*用户代码结束*/

/*包含文件*/

#include "sys_common.h"
#include "system.h"
#include "reg_gio.h"
/*用户代码开始(1)*/
/*用户代码结束*/

/**@fn void main (void)
*@应用程序主函数简介
*@请注意、默认情况下、此函数为空。
*
*此函数在启动后调用。
*用户可以使用此函数来实现应用程序。
*

/*用户代码开始(2)*/
/*用户代码结束*/

int main (空)

/*用户代码开始(3)*/
hetInit();
gioInit();
while (1);
/*用户代码结束*/


/*用户代码开始(4)*/
unsigned int 转速计数1 = 0;//计数风扇的转数
unsigned int 转速计数2 = 0;//计数风扇的转数
unsigned int 转速 RPM1 = 0;//存储风扇的 RPM
unsigned int 转速 RPM2 = 0;//存储风扇的 RPM
unsigned int lastRPM1 = 0;//存储上次读取的 RPM
unsigned int lastRPM2 = 0;//存储上次读取的 RPM


refreshTach();//更新转速计
_enable_interrupt_(TACH1);//启用转速计中断
_enable_interrupt_(TACH2);//启用转速计中断

void updateTach (void)

_disable_interrupt_(TACH1);//禁用转速计中断
_disable_interrupt_(TACH2);//禁用转速计中断
__nop();//等待1个指令周期
//将脉冲计数转换为 RPM
转速 RPM1 =(转速计数1/PULSESPERREVOLUTION1)*60;
转速 RPM2 =(转速计数2/PULSESPERREVOLUTION2)*60;
_enable_interrupt_(TACH1);//重新启用转速计中断
_enable_interrupt_(TACH2);//重新启用转速计中断
转速计数1 = 0;//重置脉冲计数器
转速计数2 = 0;//重置脉冲计数器

空的清爽提神()

updateTach();//刷新转速计读数
printf ("RPM =%i\n"、转速 RPM1);//打印第一个电机的 RPM
printf ("RPM =%i\n"、转速 RPM2);//打印第二个电机的 RPM

/*用户代码结束*/

头文件

important.h
*
*创建日期:2018年9月7日
*作者:chuks
*

#ifndef source_importal_H_
#define Source_Important H_


// Porta 引脚配置
#define TACH1位0
#define TACH2位1

#define PULSESPERREVOLUTION1 2.
#define PULSESPERREVOLUTION2

/******** 函数原型 /

void updateTach (void);
//用法:将转速计脉冲计数转换为实际 RPM 值
//参数:无
void refreshtach (void);
//用法:更新与转速计对应的所有变量
//参数:无

#endif /* source_Important _H_*/

请、有什么关于我为什么遇到错误以及它不起作用的建议?

此致

 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好、Chuck、

    我的理解是、您使用 GIO 中断例程来捕获 GIO 引脚上的事件。 您需要在 HALCoGen 中启用 GIO 中断吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

     QJ Wang、您好!

    感谢您的回答。 我尝试了您的建议、但仍然出现以下错误。 我是否遗漏了什么?

    此致

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    我不知道如何启用和禁用 GIO 中断。 启用外设中断有3个方面:

    1.在模块级启用中断、例如 GIOA[0]:下降边沿和低优先级(低电平)

    2.在 VIM 模块中启用 GIO 中断:在步骤1中、使用低优先级、因此在 VIM 中、应启用低电平 GIO 中断

    3.在 CPU 级别(CPSR 寄存器)启用 IRQ (用于步骤2中定义的 GIO 中断)中断

    _enable_IRQ ();  

    另一个问题是、您不能调用函数之外的函数:

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    感谢您的回答。 我已按照您建议的步骤启用 GIO 中断。 但是,我并不完全理解这一意见

    ``另一个问题、您不能调用函数之外的函数:´´

    请、您能详细说明一下您的意思吗? 谢谢。

    此致
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    我是说您在函数之外调用以下函数(main()或 updateTach()):

    refreshTach();//更新转速计
    _enable_interrupt_(TACH1);//启用转速计中断
    _enable_interrupt_(TACH2);//启用转速计中断

    您可以在 main()或 updateTach()中调用这些函数。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    非常感谢、这减少了错误数量。 但是、其他错误仍然存在。 我怀疑我没有正确定义或配置 GIO。  我想使用 GIOA[0]和 GIOA[1]作为输入来接收来自两个直流电机的转速计信号。 这就是我在头文件中所做的操作:

    // Porta 引脚配置

    #define TACH1  gioPORTA、0

    #define TACH2  gioPORTA、1.

    我在函数调用´´中得到错误``参数太多

    请您提出任何建议。

    此致

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    非常感谢、这减少了错误数量。 但是、其他错误仍然存在。 我怀疑我没有正确定义或配置 GIO。  我想使用 GIOA[0]和 GIOA[1]作为输入来接收来自两个直流电机的转速计信号。 这就是我在头文件中所做的操作:

    // Porta 引脚配置

    #define TACH1  gioPORTA、0

    #define TACH2  gioPORTA、1.

    我在函数调用´´中得到错误``参数太多

    请您提出任何建议。

    此致

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你好、Chuck、
    这两个宏对我来说毫无意义。 为 TACH1和 TACH2分配了什么值?
    #define TACH1 gioPORTA、0
    #define TACH2 gioPORTA、1.

    2._enable_IRQ (..) 是您定义的函数吗?

    您可以在 HALCoGen 中启用 GIO 中断。 中断例程生成、位于 Gio.c 中 您可以在 gioNotification()中添加代码。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    感谢迄今提供的所有援助,我取得了重大进展。 不过,我还有另一个问题。 让我先简要解释一下我的项目、然后再提出问题。
    我打算使用 RM48 Hercules 开发套件(HDK)使用 PWM 驱动两个直流电机风扇(Nidec TA450DC)、并在 Code Composer Studio 中显示它们的 RPM。 使用 Halcogen 和 Code Composer Studio、我已经按照之前的指示执行了所有正确的步骤。 HET 引脚9和10将 PWM 发送到两个直流电机风扇。 GIOA[0]和 GIOA[1]用作输入、以接收来自两个直流电机风扇的转速计信号。

    我的问题与中断例程有关。 我需要这两个函数:

    转速计数1++;
    转速计数2++;

    在启用中断时调用。 例如、这就是我的意思

    如果发生 GIOA[0]中断或检测到转速计信号、
    转速计数1++;



    如果发生 GIOA[1]中断或检测到转速计信号、
    转速计数2++;


    在代码中代表这种情况的正确方式是什么?
    2.我是否应该在 Gio.c 中的中断例程中包含这两个函数?

    期待您的回复。

    此致
    丘克
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好、Chuck、

    当 GIO 中断发生时,代码将跳转到 GIO ISR:gioHighLevelInterrupt(),它们跳转到 gioNotification(.) 在 notification.c 中定义 您可以在此函数中添加代码:

    #pragma weak (gioNotification)

    void gioNotification (gioPORT_t *端口、uint32位)

    /* 在用户代码开始和用户代码结束之间输入用户代码。 *

    /*用户代码开始(19)*/

     if (bit ==1){

          转速计数1++;

     }else if (位==2)

          转速计数2++;

     }

    /*用户代码结束*/

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    感谢您的帮助。 我已作了必要的修改。 我的代码可以成功编译并传输到 RM48 HerculesTm开发套件。 但是、当我连接两个直流电机风扇(Nidec TA450DC)时、该错误会弹出``IcePick:目标 CPU´´上的电源故障

    SYS_MAIN.c   

    int main (空)
    /*用户代码开始(3)*/
          hetInit();
          gioInit();
          while (1);
    /*用户代码结束*/
    /*用户代码开始(4)*/
    无符号 int 转速计数1 = 0;          //风扇转数
    无符号 int 转速计数2 = 0;          //风扇转数
    无符号 int 转速 RPM1 = 0;           //存储风扇的 RPM
    无符号 int 转速 RPM2 = 0;           //存储风扇的 RPM
    void updateTach (void)
      refreshtach();                //更新转速计
      _enable_IRQ ();            //启用转速计中断
      gioSetBit (gioPORTA、0、0);       //在 gioA 引脚0上创建下降沿中断
      gioSetBit (gioPORTA、1、0);       //在 gioA 引脚1上创建下降沿中断
      _DELAY_CYCLES (1000);         //等待1秒
      disable_IRQ ();             //禁用转速计中断
      转速计数1 = 0;               //将脉冲计数器重置为计算做好准备
      转速计数2 = 0;               //将脉冲计数器重置为计算做好准备
                           //将脉冲计数转换为 RPM
      转速 RPM1 =(转速计数1/PULSESPERREVOLUTION1)*60;
      转速 RPM2 =(转速计数2/PULSESPERREVOLUTION2)*60;
    空的清爽提神()
      updateTach();               //刷新转速计读数
      printf ("RPM1 =%i\n"、转速 RPM1);       //打印第一个电机的 RPM
      printf ("RPM2 =%i\n"、转速 RPM2);       //打印第二个电机的 RPM
    通知.c


    /*在用户代码开始和用户代码结束之间输入用户代码。 *
    /*用户代码开始(19)*/
    gioSetBit (gioPORTA、位、1);

    unsigned int 转速计数1 = 0;//计数风扇的转数
    unsigned int 转速计数2 = 0;//计数风扇的转数

    如果(位= 1)

    转速计数1++;

    否则、如果(位== 2)

    转速计数2++;

    /*用户代码结束*/

    amaechi.h       (创建的头文件)

    /*
    * amaechi.h
    *
    *创建日期:2018年10月22日
    *作者:k2mon
    *

    #ifndef SOURC_AMAECHI_H_
    #define Source_AMAECH_H_


    #define PULSESPERREVOLUTION1 2.
    #define PULSESPERREVOLUTION2

    /******** 函数原型 /

    void updateTach (void);
    //用法:将转速计脉冲计数转换为实际 RPM 值
    //参数:无
    void refreshtach (void);
    //用法:更新与转速计对应的所有变量
    //参数:无


    #endif /* source_AMAECHI_H_*

    请、我是否采取了错误的方法? 我们将感谢您的任何帮助。

    此致

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你好、Chuck、

    如何将电机连接到 HDK? 电机是否使用来自 HDK 的电源?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    两个电机都是12V 电机、因此两个电机都使用来自 HDK 的电源。 这是错误的方法吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果电机消耗两大电流、则可能会导致 HDK 电源故障。 请为电机使用单独的电源。