您好!
我使用 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
}