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.

[参考译文] MSP430FR2433:IR模块输出信号时出现问题

Guru**** 2610895 points
Other Parts Discussed in Thread: MSP430FR2433

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/661723/msp430fr2433-issues-outputting-signal-with-ir-module

部件号:MSP430FR2433

大家好,我在MSP430fr2433上的IR模块获得稳定输出时遇到问题。

我已经在WFP 1.2 的示波器上确认我正在使用Timer_A0生成一个38 kHz的信号。

我还在WFP 1.4 上确认我正在用Timer_A1生成一个500 Hz的信号。

用户手册(slau445g)的第53页似乎表示我需要设置以下寄存器

IRDATA = 0
IRDSEL = 1
IRMSEL = 0
IREN = 1

当我把这些放到示波器上时,我得到的只是一个高输出的WFP 2.6

我的代码如下。 是否有人对我做错了事有任何建议?

// IR发射器测试

#include "driverlib.h"
#include "MSP430-h"

//************************************************************************************************
////
引脚编号
////**************************************************************************************

//引脚1.0 =用于MSP430FR2433开发板的板载红色LED -设置为基本输出
//引脚2.6 = IR LED。 引脚设置为IR传输模式IREN
//引脚2.7 =用于MSP430FR2433开发板的板载开关。 设置为从高到低的触发

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

void Init_Clock(void);
void Init_GPIO (void);
void Start_38k_Timer(void);
void Start_Envelope_Timer(void);
void BlinkLED();

//************************************************************************************************
////
全局变量
////******************************************************************************

易失性UINT32_t按钮Debouncy;/************

照明相关全局变量************** ///
空白表示NOW


/************ IR TX相关全局变量************ ///unsigned
char IR_code =0;
//unsigned char IR_flag =0;
unsigned char IR_stop =0;
unsigned char byte_cnt =0;
unsigned int bit_sel =0;
unsigned char *send_addr;
unsigned char send_data[4]={0x55, 0xAA, 0x00, 0x00, 0xFF);//默认值。每隔一个字节为逆向

/************ 计时器相关全局变量************ /
UINT32_t MclockValue = 0; //用于存储当前MClock值
的变量UINT32_t SMclockValue =0; //用于存储当前SMClock值
UINT32_t AlclockValue =0的变量; //用于存储当前AClock值

的变量/************ 时钟频率************ //MCLK
的目标频率(单位:kHz
)#define CS_MCLK_Desired _Frequency_in_kHz 8000

//MCLK/FLLRef Ratio
//将其设为MCLK值除以3.2万。 这将设置一个倒计时计时器,以允许FLL适应所需的MCLK值
#define CS_MCLK_FLLREF_Ratio 250

void main (void)
{
//停止看门狗计时器
WDT_A_HOLD (WDT_A_BASE);

//初始化所有内容
init_gPIO(); //初始化GPIO
init_Clock(); //初始化时钟

//验证时钟设置是否符合预期
MclockValue = CS_getMCLK();
SMclockValue = CS_getSMCLK();
AcclockValue = CS_getACLK();

IR_STOP = 0;//启用IR发射器

同时(1)
{

//清除标记和计数器
//IR_flag = 0;
byte_cnt = 0;
bit_sel =0;

IF (IR_STOP == 0)
{
//在IR发射期间禁用端口1和端口2中断
P1IE = 0;
P2IE = 0;

//开始生成38khz信号
Start_38k_Timer();
Start_Envelope_Timer();
//停下来,坐在这里,发出稳定的38khz信号
while (1);

}
__bis_sr_register (LPM3_bits + GIE); //在启用全局中断的情况下输入LPM3

IR_STOP = 0; //启用IR代码发射
}

//输入带中断的LPM3
//__bis_sr_register (LPM3_bits + GIE);

//用于调试器
__no_operation();
}//**********************************************************************************************


////
职能
////**********************************************************************************************


//初始化时钟
无效Init_Clock (void)
{
//此函数使用driverlib来设置主板的时钟值
//有关这些函数的详细信息,请参见driverlib文档

//设置DCO FLL参考= REFO
Cs_initClockSignal (CS_FLLREF,CS_REFCLK_SELECT,CS_CLock_diver_1);

//设置比率和所需MCLK频率并初始化DCO
CS_INITFLLSettle (CS_MCLK_Desired频率_in_kHz,CS_MCLK_FLLREF_Ratio);

//设置ACLK = REFO
Cs_initClockSignal (CS_ACLK,CS_REFOCLK_SELECT,CS_CLock_diver_1);

// DCOCLK = MCLK和SMCLK源
CSCTL5 || DIVM_0 | DIVS_1; // MCLK = DCOCLK = 8MHZ,
// SMCLK = MCLK/2 = 4MHz
}//

初始化GPIO
void Init_gPIO(void)
{
//************** IR配置************** //
//配置IR输出引脚
//设置P 2.6 以输出来自IR模块的信号
GPIO_setAsPeripheralModuleFunctionOutputPin (
GPIO端口P2,
GPIO _PIN6,
GPIO主要模块功能
);


// debug -设置P 1.2 以输出Timer_A0中的信号
//有关如何手动设置的说明,请参阅第328页上的slau445g
GPIO_setAsPeripheralModuleFunctionOutputPin (
GPIO端口P1,
GPIO _PIN2,
GPIO辅助模块功能
);

// debug -设置P 1.4 以输出Timer_A1中的信号
GPIO_setAsPeripheralModuleFunctionOutputPin (
GPIO端口P1,
GPIO _PIN4,
GPIO辅助模块功能
);

//当前设置为FSK调制,输出设置为高
//配置IR调制-请参阅第78页的slau445g
//位4 = IRDATA
//位3= IRDSSEL - IR数据源选择0=硬件|1= IRDATA位
//位2 = IRMSEL - IR模式选择0 = ASK | 1 = FSK
//位1 = IRPSEL -极性(请勿触摸)
//位0 = IREN - IR启用0=关|1=开
SYSCFG1 = IRDSEL + IREN; //数据源= IRDATA位,ASK模式

pm_unlockLPM5();
}

void Start_38k_Timer(void){
//此设置使用timer_A0配置并启动稳定的38khz信号
//自slau445g第363页起的计时器配置步骤顺序

//第1步-清除所有内容slau445g第377页
TA0CTL = TCLR;

//步骤2 -初始化Timer_A0捕获/比较寄存器slau445g,第381页
// 38kHz 1/4占空比载波波形长度设置 sla644b第10页
//基于4 MHz时钟进行配置!!
TA0CCR0 = 104; //(4000 / 38 = 105)(计时器计数从0开始)
TA0CCR2 = 25; //(105 / 4 = 26)(1/4个省电工作周期)

//步骤3 -配置Timer_A0捕获/比较控制寄存器 slau445g第379页
TA0CCTL2 = OUTMOD_7; //输出模式:重置/设置

//步骤4 -配置Timer_A0控制寄存器 slau445g第377页
//定时器操作模式设置
// TALCLR =定时器A计数器清除
// tassel_2 =定时器A时钟源选择:2- SMCLK
// mc_1. =定时器A模式控制:1-至CCR0
TA0CTL = tassel_2 + MC_1;
}

作废Start_Envelope_Timer(void){
//此设置使用timer_A0配置信封定时信号
//自slau445g第363页起的计时器配置步骤顺序

//当前配置为输出恒定的高信号

//第1步-清除所有内容slau445g第377页
TA1CTL = TCLR;

//步骤2 -初始化Timer_A1捕获/比较寄存器slau445g第381页
// 9毫秒
//基于4 MHz时钟进行配置!!
TA1CCR0 = 8000 - 1; //(400万 x 0.001 = 4000 + TA1CCR2 = 8000)(低1毫秒)
TA1CCR2 = 4000 - 1; //(400万 x 0.001 = 4000)(1毫秒高)

//步骤3 -配置Timer_A1捕获/比较控制寄存器 slau445g第379页
TA1CCTL2 = OUTMOD_7; //输出模式:重置/设置

//步骤4 -配置Timer_A1控制寄存器 slau445g第377页
//定时器操作模式设置
// TALCLR =定时器A计数器清除
// tassel_2 =定时器A时钟源选择:2- SMCLK
// mc_1. =定时器A模式控制:1-至CCR0
TA1CTL = tassel_2 + MC_1;
}

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

    我们的网站上有一些可能对您有帮助的资源。

    下面的链接是一个应用报告,介绍了如何使用我们的MSP设备实施IR远程控制。
    www.ti.com/.../slaa644b.pdf

    此链接是另一个应用报告,它也解释了IR远程控制的实施。 这是一个较旧的版本,但我将其包含在其中仅供参考。
    www.ti.com/.../slla175.pdf

    此处是指向TI IR远程控制设计的链接。 您可以在此处找到说明如何实现IR功能的示例代码。
    www.ti.com/.../TIDM-BOOST-IR-REMOTE

    如果您仍有疑问,请告诉我。

    谢谢!

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

    感谢Mitch的建议。 我实际上一直在使用这些资源和其他一些资源来设计我的代码。 我无法弄清楚的部分是slau445g用户手册第53页中所述的内置IR模块的功能。

    我的问题基于下图。 我有一个38 kHz的载波信号是从TA0.2A (WFP 1.2)输出的,还有一个500 Hz的信封信号输出是从TA1.2A (WFP 1.4)输出的。 使用示波器进行了两种验证。

    I设置:

    IREN = 1
    IRMSEL = 0
    IRDSEL = 1

    引脚2.6 设置为输出,SEL位设置为1,以用作UCA1TXD/'UCA1SIMO (来自MSP430fr2433数据表的第57页)

    为什么在WFP 2.6 上没有输出? 这不应该产生一个38 kHz的信号,1毫秒的传输时间和1毫秒的关闭时间?

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

    我正在进一步研究这一点。 感谢您提供信息。

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

    谢谢! 使用硬件模块看起来比使用软件PWM发送信号要高效得多。

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

    您好,Sandy,

    用户指南中有拼写错误。 如图所示,IR输出引脚为WFP 2.6 / UCA1TXD,不正确。 对于所有MSP430FR2x4x器件,IR输出引脚位于UCA0TXD上,但不在UCA1TXD上。 我在您的代码中将红外线引脚更改为了WFP 1.4 或UCA0TXD (如附件所附),然后它按预期工作。 我已向用户指南所有者提供反馈,打字错误将会更新。

    e2e.ti.com/.../FR2433_5F00_IR.c

    此致,

    Darren

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢! 至少现在我知道我并不疯狂。