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.

[参考译文] MSP-EXP430FR5994:运行BLDCs时钟频率问题

Guru**** 2606725 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/654273/msp-exp430fr5994-clock-diveder-issue-with-running-bldcs

部件号:MSP-EXP430FR5994

您好,

我正在研究BLDCs (无刷直流电动机)。 为了产生PWM信号以运行电机,我使用计时器B,其时钟信号被选为SMCLK。 我将1 MHz DCO时钟信号设置为MCLK和SMCLK的信号源。 使用这些设置,我可以使用生成的PWM运行BLDCs。 由于几个原因,现在我需要将DCO频率更改为8 MHz,同时将定时器B时钟信号SMCLK的频率保持在1MHz。 为了实现这些目标,我尝试使用计时器B TBCTL寄存器的ID位(内部分配器(ID_3))或时钟源寄存器CSCTL3的DIVs位(SMCLK源分配器(DIVS_3))。 采用这种新配置时,尽管定时器B时钟源的频率保持不变,但电机不会使用这种新设置运行。 我阅读了设备特定数据表和家庭用户指南的相关部分,但无法找到合适的解决方案。 如果您能提供帮助,我将很高兴。 谢谢你。  

////////////////////////// *********** 配置1*************** //////////////////////////////////
#include <MSP4S.h>
#include <stdio.h>

void main (void)
{

WDTCTL = WDTPW | WDTHOLD; //停止监视计时器

//时钟设置
CSCTL0_H = CSOKEY >> 8; //解锁CS寄存器
CSCTL1 = DCOFSEL_0 | DCORSEL; //将DCO设置为1MHz
CSCTL2 =拉美_ VLOCLK | SESS__DCOCLK | SELM__DCOCLK;//设置ACLK = VLOCLK;MCLK = SMCLK = DCO
//延迟~10us,让DCO结算。 60个周期= 20个周期缓冲+(10us /(1/4MHz))
__DELAY周期(60);
CSCTL3 = DIVA__1 | DIVs__1 | DIVM__1; //设置所有分禾器

//锁定CS寄存器-为什么不创建PUC?
CSCTL0_H = 0;

//电机1
P1DIR |= BIT4;
P1SEL0 |= BIT4;
P1SEL1 &=~BIT4;

TBCTL = MC_0; //在配置计时器B之前停止计时器

TBCCR0 = 2万;
TBCCTL1 = OUTMOD_7;
TBCCR1 = 850;

//电机2,
P1DIR |= BIT5;
P1SEL0 |= BIT5;
P1SEL1 &=~BIT5;
TBCCTL2 = OUTMOD_7;
TBCCR2 =850;


//电机3.
P3DIR |= BIT4;
P3SEL0 |= BIT4;
P3SEL1 &=~BIT4;
TBCCTL3 = OUTMOD_7;
TBCCR3 = 850;

//电机4.
P4DIR |= BIT4;
P4SEL0 |= BIT4;
P4SEL1 &=~BIT4;
TBCCTL5 = OUTMOD_7;
TBCCR5 =850;
TBCTL = TBSSEL_2 + MC_1 + ID_0;
//TBEX0 = TBIDEX_1;
TBCTL |= TBCLR;

//禁用GPIO开机默认高阻抗模式以激活
//以前配置的端口设置
PM5CTL0 &=~LOCKLPM2;

__DELAY周期(100万);
TBCCR1=1330;
__DELAY周期(100万);
TBCCR2=1330;
__DELAY周期(100万);
TBCCR3=1350;
__DELAY周期(100万);
TBCCR5=1330;
}////////////////////////


*********** 配置2*************** //////////////////////////////////

#include <MSP4S.h>
#include <stdio.h>

void main (void)
{

WDTCTL = WDTPW | WDTHOLD; //停止监视计时器

//时钟设置
CSCTL0_H = CSOKEY >> 8; //解锁CS寄存器
CSCTL1 = DCOFSEL_3 | DCORSEL; //将DCO设置为8MHz
CSCTL2 =拉美_ VLOCLK | SESS__DCOCLK | SELM__DCOCLK;//设置ACLK = VLOCLK;MCLK = SMCLK = DCO
//延迟~10us,让DCO结算。 60个周期= 20个周期缓冲+(10us /(1/4MHz))
__DELAY周期(60);
CSCTL3 = DIVA__1 | DIVs__8 | DIVM__1; //设置所有分禾器

//锁定CS寄存器-为什么不创建PUC?
CSCTL0_H = 0;

//电机1
P1DIR |= BIT4;
P1SEL0 |= BIT4;
P1SEL1 &=~BIT4;

TBCTL = MC_0; //在配置计时器B之前停止计时器

TBCCR0 = 2万;
TBCCTL1 = OUTMOD_7;
TBCCR1 = 850;

//电机2,
P1DIR |= BIT5;
P1SEL0 |= BIT5;
P1SEL1 &=~BIT5;
TBCCTL2 = OUTMOD_7;
TBCCR2 =850;


//电机3.
P3DIR |= BIT4;
P3SEL0 |= BIT4;
P3SEL1 &=~BIT4;
TBCCTL3 = OUTMOD_7;
TBCCR3 = 850;

//电机4.
P4DIR |= BIT4;
P4SEL0 |= BIT4;
P4SEL1 &=~BIT4;
TBCCTL5 = OUTMOD_7;
TBCCR5 =850;
TBCTL = TBSSEL_2 + MC_1 + ID_3;
//TBEX0 = TBIDEX_1;
TBCTL |= TBCLR;

//禁用GPIO开机默认高阻抗模式以激活
//以前配置的端口设置
PM5CTL0 &=~LOCKLPM2;

__DELAY周期(100万);
TBCCR1=1330;
__DELAY周期(100万);
TBCCR2=1330;
__DELAY周期(100万);
TBCCR3=1350;
__DELAY周期(100万);
TBCCR5=1330;
}

真诚  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    配置2显示除以/8两次(一次在CS中,一次在TB中),结果为/64。 这是您想要的吗?

    请记住,__delay_cycles在MCLK运行,而不是在SMCLK运行。 通过增加MCLK,main()末尾的呼叫从“可见”(1秒)到“几乎不可见”(1/8秒)。 (如配置2中所编码,延迟甚至不允许单个/64 TBCCR0周期。)

    我建议您以(至少)一段时间(1){}结束main(),以防止它返回。 我忘记了如果main()返回,(TI) C运行时会执行什么操作,但它很少有用。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这个/64部门是打字错误,很抱歉,我在重新安排代码以便清楚地展示问题时忘记更改它。

    问题是由延迟周期(1/8秒)引起的。 很可能1/8秒的时间不足以让ESCs (电子速度控制器)起动电动机。 谢谢,这真的很有帮助。 由于电机现在在我的朋友那里,我很遗憾现在无法测试它。 当(TI) C运行时检测到异常程序终止时,它将其置于无限循环(for (;););)中,但正如您建议的那样,将while (1)或类似的方法放置是更合适的,因为不放置它们毕竟是“异常终止”。 再次感谢..