问题都比较的基础和低级,仅记录一下。
问题一:stm32的某个.c文件中无法调用另一个.c中的指定变量,怎么解决?
以g_ADC_sample_vaule.Iu 为例,它是 drive_adc_info.c 里面的变量,想要在system_time_sequence.c里面调用,必须要满足条件:
(1)system_time_sequence.c 里面扩了drive_adc_info.h
(2)drive_adc_info.h 里面 加入extern ADC_Value_Str g_ADC_sample_vaule;
问题二:怎么嵌套的定义结构体?
以电机控制中的电流为例,电流作为一个比较大的范围,包括有ADC采样所得的UVW相电流,也有坐标变换之后的Ialpha Ibeta 还有 Id Iq,可以把IUVW、Ialphabeta、Idq作为小结构体,然后把电流作为一个大的结构体。首先可以先定义IUVW、Ialphabeta、Idq的小结构体;
typedef struct UWM_Var_Str_Def{
float U;
float V;
float W;
}UWM_Var_Str;
typedef struct AlphaBeta_Var_Str_Def{
float alpha;
float beta;
}AlphaBeta_Var_Str;
typedef struct DQ_Var_Str_Def{
float d;
float q;
}DQ_Var_Str;
typedef struct AmpTheta_Var_Str_Def{
float amp;
float theta;
}AmpTheta_Var_Str;
然后再定义电流的结构体,另外像电流在全局都会用的信息,最好是全局定义。
typedef struct Current_Value_Str_Def
{
UWM_Var_Str Iuvw;
AlphaBeta_Var_Str IAlphaBeta;
DQ_Var_Str Idq;
AmpTheta_Var_Str IAmpTheta;
}Current_Value_Str;
问题三:在子函数的定义中是指针定义时,如何调用该子函数?
也必须是用指针调用,例如函数UVW_To_AlphBeta_Axes中形参都是结构体指针,那么在中断中调用的时候也应与此对应,UVW_To_AlphBeta_Axes函数中的结构体指针都是直接指向地址的,因此调用的时候要给到子函数的,不再是函数变量而是具体的地址。
void UVW_To_AlphBeta_Axes(UWM_Var_Str *pUVW, AlphaBeta_Var_Str *pAlphBeta)
{
pAlphBeta->alpha = 0.4714045207910f * (pUVW->U - (0.5f * (pUVW->V + pUVW->W)));
pAlphBeta->beta = 0.4082482904638f * (pUVW->V - pUVW->W);
}
其调用如下所示,通过取地址符&对g_Current.Iuvw进行取地址,然后应用g_Current.Iuvw结构体中的U、V、W;值得注意的是g_Current.Iuvw的定义一定要与UVW_To_AlphBeta_Axes调用的语句对应,即函数中用的是pUVW->U,那么g_Current.Iuvw结构体中就必须也是g_Current.Iuvw.U,名称必须完全一致。
UVW_To_AlphBeta_Axes(&g_Current.Iuvw,&g_Current.IAlphaBeta);
问题四:@brief 和 @retval 有什么作用?
具体作用就是在编译器中,假如鼠标悬浮的时候,能够直接显示函数定义和返回值具体定义
* @brief Udc采样值
* @retval
*/
void Drive_Udc_Info_Init(void)
{
g_Udc_info.Udc_adj_coff = 1.0f;
}
问题五:采样系数怎么算?
采样电阻的阻值是0.01R,10A电流产生的压降是10*0.01 = 0.1V
放大后输出电压 =
此时我们的 R1 = 2k R2 = 33k R3=2k R4 = 33k
Vout = [(33+2)/2]*[(e1*33+1.65*2)/(33+2)]=16.5e1 + 1.65
而 采样电阻等于0.01欧,则 Vout = 0.165Ia +1.65
当Ia = 10A时,Vout = 3.3
当Ia = -10A时,Vout = 0