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.

[参考译文] MSP430F5172:GPIO 引脚配置

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1040268/msp430f5172-gpio-pin-configuration

器件型号:MSP430F5172

您好!  

我正在尝试使用 GPIO 引脚控制电池状态控制开关。 我使用了相同的端口、但使用了不同的引脚来设置 PWM 通道。 但是、我的理解是、这些引脚不应相互干扰。 但是、即使我的电池开关控制输出应为1、它也会随机变为零并重新开启。 PWM 输出也会变为低电平和高电平、有时这会与电池开关信号重叠。 我配置引脚的方式是否有问题? 该代码应感应输入电压传感器值、触发和 ADC 中断、并启用或禁用电池开关。 提前感谢您。  

代码如下

初始代码

/*
P1SEL |= BIT7;//将 P1.7设置为输出方向-高降压
P1DIR |= BIT7;

P2SEL |= BIT0;//将 P2.0设置为输出方向-低降压
P2DIR |= BIT0;

P2SEL |= BIT2;//将 P2.2设置为输出方向-高升压
P2DIR |= BIT2;

P2SEL |= BIT3;//将 P2.3设置为输出方向-低升压
P2DIR |= BIT3;
*

//配置 ADC 引脚
PMAPPWD = 0x02D52;//启用写入访问以修改端口映射寄存器
PMAPCTL = PMAPRECFG;//允许在运行时重新配置
P1MAP0|= PM_ANALOG;//修改所有 PxMAPy 寄存器- A0 - Iin
P1MAP1|= PM_ANALOG;//修改所有 PxMAPy 寄存器- A1 - Vout_BUCK
P1MAP2|= PM_ANALOG;//修改所有 PxMAPy 寄存器- A2 - Vout
P1MAP3|= PM_ANALOG;//修改所有 PxMAPy 寄存器- A3
P1OMAP4|= PM_ANALOG;//修改所有 PxMAPy 寄存器- A4 - Vbat
P1MAP5|= PM_ANALOG;//修改所有 PxMAPy 寄存器- A5 - Iout
P3MAP5|= PM_ANALOG;//修改所有 PxMAPy 寄存器- A8 - Ibat
P3MAP6|= PM_ANALOG;//修改所有 PxMAPy 寄存器- A7 - Vin
P2MAP2|= PM_TD1_1;
P2MAP3|= PM_TD1_2;
P2MAP0|= PM_TD0_2;
P1MAP7|= PM_TD0_1;

P1SEL |=BIT7+BIT5+BIT4+BIT3+BIT2+BIT1 +BIT0;//在应用模拟信号时将端口映射寄存器 PxMAPy 与 PxSEL.y=1一起设置为 PM_ANALOG
P3SEL |=BIT6+BIT4;

P2SEL |= BIT0+BIT2+BIT3;
P2DIR |= BIT0+BIT2+BIT3;
P1DIR |= BIT7;

P3SEL &=(~BIT0);//将 P3.0设置为 GPIO 和输出方向- BAT_GD_EN
P3DIR |= BIT0;

P2SEL &=(~BIT6);//将 P2.6设置为 GPIO 并设置为输出方向- Vgate BAT
P2DIR |= BIT6;

PMAPPWD = 0;//通过写入不正确的密钥来禁用写入访问以修改端口映射寄存器

//主代码

while (1)

SetADC(7);
GetADC(7);

// ADC10中断服务例程
#pragma vector=ADC10_vector
_interrupt void ADC10_ISR (void)


switch (__event_in_range (ADC10IV、12))

情况0:中断;//无中断
情况2:中断;//转换结果溢出
情况4:中断;//转换时间溢出
情况6:中断;// ADC10HI
情况8:中断;// ADC10LO
情况10:中断;// ADC10IN
情况12:
ADC10CTL0 &=~ADC10ON;// ADC10被完全禁用
ADC_Result = ADC10MEM0;

VIN_TEM=ADC_RESULT;

if (Vin_temp>=Vin_min){
Offbatter();
SetDuty_Buck (D_buckH、D_buckL);
__DELAY_CYCLES (10);//序列转换之间的延迟

否则、如果(Vin_temp =Vin_minabs){
//关闭降压级
OffBuck (0、0);
__DELAY_CYCLES (100);//序列转换之间的延迟
OnBattery();
__DELAY_CYCLES (50);//序列转换之间的延迟
//打开升压级
SetDuty_Boost (D_boostH、D_boostL);

否则、如果(<Vin_minABS))

Offbatter();
OffBuck (0、0);
OffBoost (0、0);

_BIC_SR_REGISTER_ON_EXIT (CPUOFF);
中断;//从0 (SR)清除 CPUOFF 位
默认值:break;

void OnBattery(){

P3OUT |= BIT0;//将3.0设置为高电平-启用电池 GD
P2OUT |= BIT6;//set 2.6至高电平

void OffBattery(){
P3OUT &=~BIT0;//将3.0设置为低电平-禁用电池 GD
P2OUT &=~BIT6;//set 2.6至 LOW -禁用电池 FET

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

      

    这里是信号的图像、浅蓝色是电池开关控制信号、它应该一直保持在打开状态、粉色是其中一个功率级的栅极信号。 深蓝色表示输入电压、由于它处于所需的阈值范围内、因此电池 FET 应该保持导通状态。  

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

    您好 Firehiwot、

    您的代码中似乎只有一个关闭电池开关控制的位置:

    if (Vin_temp>=Vin_min){
    Offbatter();

    因此,这告诉我您的一些 ADC 读数符合此逻辑(Vin_temp >= Vin_min)并关闭电池。  如果是这种情况,您可能需要仔细检查 ADC 值是否存在潜在随机噪声。

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

    尊敬的 Dennis:  

    感谢您的回答。 实际上、我在两种情况下将电池开关设置为关闭、是的、注释掉这些代码行可消除电池电压的随机变化。

    在调试模式下检查 ADC 值时、我看到它们在预期范围内、因此不确定如何进行调试。 你有什么建议吗? 此外、只需注释 掉第二个条件(即我测试的条件)中的 SetDuty_Boost (D_boostH、D_boostL)代码行即可确保电池开关控制信号的稳定输出。 您认为这可能发生的原因是什么(这就是我认为 GPIO 引脚配置方式可能有问题的原因)。  

    谢谢、  

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

    我想我可以使用 LED 来检测是否会进入这些代码行、但仍然不确定为什么注释掉占空比函数会影响电池控制信号。 这是用于为您的基准设置占空比的代码。  

    void SetDuty_Boost (unsigned int dboostH、unsigned int dboostL){
    //TD1CTL1 |= TDCLR;//针对 TD1复位计时器
    TD1CCTL1 |= OUTMOD_2 + CLLD_2;// TD1CCR1、切换复位
    TD1CCR1 = dboostH;// TD1.1升压高侧
    TD1CCTL2 |= OUTMOD_6 + CLLD_2;// TD1CCR2、切换设置
    TD1CCR2 = dboostL;// TD1.2升压低侧
    TD1CTL0 |= MC_3 + TDCLR;//up/down 模式、清除 TDR

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

    您好、Firehiwot、

    不确定为什么注释掉占空比功能会影响电池控制信号。

    尝试隔离问题。  通过移除 ADC 部分来减少代码。  也许可以设置一个调用 SetDuty_Boost()函数的循环,并查看 P2.6和 P3.0是否会受到任何影响。

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

    谢谢你。