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:闭环补偿器中的浮点变量

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1027132/msp430f5172-float-variables-in-closed-loop-compensator

器件型号:MSP430F5172

您好!  

我使用 MSP430F5172微控制器来运行降压转换器。 我在 PLC 中测试了我的闭环控制器。 但是、我在微控制器中遇到了闭环调节问题。 我注意到、使用浮点变量会显著缩短我的执行时间和 ADC 采样频率。 我尝试使用补偿器变量的整数和浮点值、但尚未成功。 在使用浮点变量时、是否有方法来优化代码执行时间? 是否还有一种方法可以使用整数变量并使代码仍然有效? 我的开关频率为500kHz、下面是 main 中代码的片段。 谢谢你。  

浮点 KP=1;
float ki=0.1;
浮点 Vbuckout_ref=214;
float D_buckH=0、D_buckL=0;//降压占空比
浮点 Vbuckout_err=0、Vbuckout_err1=0;//先前和当前错误
float SUM = 0、SUM_1 = 0;
float sum_max=19000;
float dbuck_max=190;

void main (void){


WDTCTL = WDTPW + WDTHOLD;//停止看门狗计时器

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

P3SEL |= BIT0;//将 P3.0设置为输出方向- BAT_GD_EN
P3DIR |= BIT0;

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

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

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

P2SEL |= BIT6;//将 P2.6设定为输出方向- Vgate BAT
P2DIR |= BIT6;

//配置 ADC 引脚
PMAPPWD = 0x02D52;//启用写入访问以修改端口映射寄存器
PMAPCTL = PMAPRECFG;//允许在运行时重新配置
P1MAP0|= PM_ANALOG;//修改所有 PxMAPy 寄存器- A0
P1MAP1|= PM_ANALOG;//修改所有 PxMAPy 寄存器- A1
P1MAP2|= PM_ANALOG;//修改所有 PxMAPy 寄存器- A2
P1MAP3|= PM_ANALOG;//修改所有 PxMAPy 寄存器- A3
P1OMAP4|= PM_ANALOG;//修改所有 PxMAPy 寄存器- A4
P1MAP5|= PM_ANALOG;//修改所有 PxMAPy 寄存器- A5
P3MAP5|= PM_ANALOG;//修改所有 PxMAPy 寄存器- A8
P3MAP6|= PM_ANALOG;//修改所有 PxMAPy 寄存器- A7
PMAPPWD = 0;//通过写入不正确的密钥来禁用写入访问以修改端口映射寄存器
P1SEL |=BIT5+BIT4+BIT3+BIT2+BIT1+BIT0;//在应用模拟信号时将端口映射寄存器 PxMAPy 与 PxSEL.y=1一起设置为 PM_ANALOG
P3SEL |=BIT6+BIT4;

//将 Vcore 设置增加到3级以支持 fsystem=25MHz
//注意:一次改变一个电平内核电压。

SetVcoreUp (0x01);
SetVcoreUp (0x02);
SetVcoreUp (0x03);

//将 DCO 初始化为25MHz
_bis_SR_register (SCG0);//禁用 FLL 控制循环-设置 SCG0
UCSCTL0 = 0x0000;//设置可能的最低 DCOx、MODx
UCSCTL1 = DCORSEL_6;//选择 DCO 范围4.6MHz-88MHz 运行
UCSCTL2 = FLLD_1_763;//将 DCO 乘法器设置为25MHz
//(N + 1)* FLLRef = Fdco
//(762 + 1)* 32768 = 25MHz
//设置 FLL Div = fDCOCLK/2

_BIC_SR_register (SCG0);//启用 FLL 控制循环-清除 SCG0

// DCO 范围位已经存在时、DCO 的最坏情况稳定时间
//已更改 n x 32 x 32 x f_MCLK / f_FLL_reference。 请参阅5xx 中的 UCS 一章
// UG 进行优化。
// 32 x 32 x 25 MHz/32、768Hz = 781250 = DCO 稳定的 MCLK 周期
//__delay_cycles (781250);
_DELAY_CYCLES (782000);

SetADC();
SetDMA();
SetPWM (T_BUCK、T_BOOST);
__DELAY_CYCLES (100);//序列转换之间的延迟

// P1DIR |= BIT0;//将 P1.0设置为输出方向

for (;;){

// ADC 采样频率=8kHz
//P1OUT ^= BIT0;//使用异或切换 P1.0

while (ADC10CTL1 & BUSY);//如果 ADC10内核处于活动状态则等待
ADC10CTL0 |= ADC10ENC + ADC10SC;//采样和转换准备就绪
_bis_SR_register (CPUOFF + GIE);// LPM0、ADC10_ISR 将强制退出

IIN_temp =(int) ADC_Result [8];
VIN_TEMP=(int) ADC_RESULT [1];
Vbuckout_temp=(int) adc_result[7];

Vbuckout_err=(Vbuckout_ref-(float) Vbuckout_temp);

sum =KP*Vbuckout_err+(sum + ki*(Vbuckout_er+Vbuckout_er1));
d_buckh= sum/1000;
if (sum>sum_max){
总和=19000;
D_buckH=190;

否则、如果(sum<0){
总和= 0;

D_buckL= D_buckH+1;
SetDuty_Buck (D_buckH、D_buckL);

Vbuckout_ERR1 = Vbuckout_err;

_bis_SR_register (LPM0_bits);//输入 LPM0

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

    您好、Firehiwot、

    我建议使用 我们的 MSP430定点数学库。  它经过优化、比计算浮点值快得多。 您可以指定所需的精度、并且可以轻松地将库 IQMATHLIB 集成到您的现有项目中。