您现在的位置是:首页 >学无止境 >STM32杂乱笔记网站首页学无止境

STM32杂乱笔记

沉沙丶 2024-07-29 06:01:03
简介STM32杂乱笔记

问题都比较的基础和低级,仅记录一下。

问题一: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

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。