浮点数2^7*29/32中/32是什么意思?

该内容详细解析了浮点数X和Y的计算过程,包括对阶、尾数求和、规格化、舍入及判溢步骤。X=27×29/322^7×29/32,Y=25×5/82^5×5/8,通过一系列计算得出X+Y的结果,并讨论了浮点数运算中的溢出情况。

在408【2009年统考真题】中,浮点数X=27×29/322^7\times29/3227×29/32,其中29/32就是整数除法,1/32也就是2−52^{-5}25,二进制就是0.00001,29=31-2,二进制就是11101,29/32也就是0.11101。X=27×0.111012^7\times0.1110127×0.11101
同理,Y=25×5/82^5\times5/825×5/8,5/8二进制就是0.101,Y=25×0.101002^5\times0.1010025×0.10100
计算x+y,对阶,尾数求和,规格化,舍入,判溢。

[x]浮=00111,00.11101,[y]浮=00101,00.10100[x]_浮=00111,00.11101,[y]_浮=00101,00.10100[x]=00111,00.11101[y]=00101,00.10100
(1)对阶 ΔE=111−101=2\Delta E=111-101=2ΔE=111101=2,所以y尾数右移2位,[y]浮=00111,00.00101[y]_浮=00111,00.00101[y]=00111,00.00101
(2)尾数求和 [x+y]浮=00111,01.00010[x+y]_浮=00111,01.00010[x+y]=00111,01.00010
(3)规格化 因为尾数符号位溢出,所以向右规格化,尾数右移,阶码加1。[x+y]浮=01000,00.10001[x+y]_浮=01000,00.10001[x+y]=01000,00.10001
(4)舍入 采用0舍1入法(如果被移除的是1,则尾数末尾加1,如果是0,则不加) 不变,[x+y]浮=01000,00.10001[x+y]_浮=01000,00.10001[x+y]=01000,00.10001
(5)判溢 阶码符号位为01,溢出。

使用前馈带饱和PI来控制d和q轴的电流得到dq的电压,使用Q格式,单位变换是将mΩ*ADC_MAX(4096)—>变换成电压单位(V:变换成max 16384),给出函数和详细的计算过程和单位换算过程(其中:Id和Iq(Q12格式)是通过ADC接口获取三相电流IA IB IC ,通过clark变换得到Ialph Ibeta,通过Park格式得到Id Iq,然后经过d和Q轴的两个PID或得Ud 和Uq, 实际使用的电机母线电压为24V,测量电压与ADC获取电压值的对应关系是 测量电压=((ADC获取电压值/4095 * 3.3V)-1.24v)*37;实际电流与ADC获取电流值的对应关系是:ADC获取电流值=((实际电流*20mΩ)*8+1.24V/3.3V *4095);实际电机的参数 相电阻0.89Ω,相电感0.62mh 额定电流4A,额定转速3000rpm,编码器线1000线 极对数4 反电动势常数(线电压有效值)4.0V/Krpm;转动惯量0.028kg.cm2.)(我这里指的Q122的12次方,范围0~4095),我已经有一些转换函数 /*************************************** 功能:Clark变换 形参:三相电流以及alpha_beta电流 说明:由三相互差120度变换到两相互差90度 Iabc(Q12格式) Ibeta Ialph Q12格式 */ void Clarke_Transf_Q12(CURRENT_ABC_DEF_Q12 Current_abc_temp, CURRENT_ALPHA_BETA_DEF_Q12* Current_alpha_beta_temp) { // 中间计算使用32位防止溢出 int32_t temp_Ib_Ic = (int32_t)Current_abc_temp.Ib - Current_abc_temp.Ic; // Ialpha = Ia Current_alpha_beta_temp->Ialpha = Current_abc_temp.Ia; // Ibeta = (Ib - Ic) * (√3/3) Current_alpha_beta_temp->Ibeta = (int16_t)(temp_Ib_Ic * SQR3_OVER_3_Q12 >> Q12_SHIFT); } /*************************************** 功能:COS_SIN值计算 形参:角度以及COS_SIN结构体 说明:COS_SIN值计算 ***************************************/ void Angle_To_Cos_Sin(int16_t angle_temp,TRANSF_COS_SIN_DEF* cos_sin_temp) { //限制速度范围 int16_t anger = angle_temp%THETA_ANGER_Q12; cos_sin_temp->Sin = sin_table_q12[anger]; anger += THETA_ANGER_DIV4_Q12; anger = anger%THETA_ANGER_Q12; cos_sin_temp->Cos = sin_table_q12[anger]; } void Park_Transf_Q12(CURRENT_ALPHA_BETA_DEF_Q12 current_alpha_beta_temp,TRANSF_COS_SIN_DEF_Q12 cos_sin_temp,CURRENT_DQ_DEF_Q12* current_dq_temp) { // 所有中间计算使用32位防止溢出 int32_t temp1 = (int32_t)current_alpha_beta_temp.Ialpha * cos_sin_temp.Cos; int32_t temp2 = (int32_t)current_alpha_beta_temp.Ibeta * cos_sin_temp.Sin; int32_t temp3 = (int32_t)current_alpha_beta_temp.Ialpha * cos_sin_temp.Sin; int32_t temp4 = (int32_t)current_alpha_beta_temp.Ibeta * cos_sin_temp.Cos; // Id = Ialpha*Cos + Ibeta*Sin current_dq_temp->Id = (int16_t)((temp1 + temp2) >> Q12_SHIFT); // Iq = -Ialpha*Sin + Ibeta*Cos current_dq_temp->Iq = (int16_t)((-temp3 + temp4) >> Q12_SHIFT); } /** * @brief 将编码器计数值转换为Q12格式角度 * @param enc_count 编码器累计计数值(32位有符号整数) * @return uint16_t Q12格式角度值(0~4095对应0~2π) */ uint16_t encoder_to_q12(int32_t enc_count) { const int32_t counts_per_rev = 4000; // 1000线编码器四倍频 int32_t mod = enc_count % counts_per_rev; // 处理负余数 if (mod < 0) { mod += counts_per_rev; } // 计算: (mod*4096 + 2000)/4000 并四舍五入 uint32_t product = (uint32_t)mod * 4096 + 2000; return (uint16_t)(product / counts_per_rev); // 0~4095 }
08-04
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值