你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

No.4 电机套件实验任务一和任务二

[复制链接]
子曰好人 发布时间:2018-9-2 10:18
本帖最后由 子曰好人 于 2018-9-2 10:21 编辑
1 t# l* U6 G, h! c7 }" K# S  C( F# T1 q2 |. ?
经过前期的准备,可以使用电机套件完成一些实验任务了。
首先是任务1和任务2的要求:
task1.png
task2.png
任务一和任务二基于workbench生成的代码来做并不难,因为代码里面提供了很多api函数并且做了很多软件上的保护,可以放心写代码,硬件不会那么容易损坏。
" h, h) R) J* s% f
拿到一份陌生的代码除了了解我前面几篇帖子所说的内容外,在开始写代码前还需要了解api函数。我们可以打开mc_api.h看一看workbench都给我们提供了什么函数。
6 ^6 [( V5 v8 n3 e
  1. /** @addtogroup MCIAPI
    7 {# o/ Q, l9 g" H) _8 L3 l
  2.   * @{1 b5 S6 K0 ~$ t  ?/ d
  3.   */
    4 i) q  L7 a3 ?* P; T
  4. ' a9 V5 b) o. J' u
  5. typedef enum {UDRC_STATE_IDLE, UDRC_STATE_REQUESTED, UDRC_STATE_EOC} UDRC_State_t;1 K8 z6 ~' @8 E# E
  6. 8 h# [! ^: w4 h! k, F
  7. /* Starts Motor 1 */
    ( i* U; q6 m+ J
  8. bool MC_StartMotor1(void);: ~6 w( `" `2 \! r

  9. 2 d  u" \1 }1 D: y) _- i$ O
  10. /* Stops Motor 1 */
    , A7 c) B  N2 w$ c  _
  11. bool MC_StopMotor1(void);- s6 ]7 h2 X7 _$ E, @
  12. 0 d& F% i' P, C
  13. /* Programs a Speed ramp for Motor 1 */
    0 f/ e4 |& r5 v0 M7 y% R; a, x
  14. void MC_ProgramSpeedRampMotor1( int16_t hFinalSpeed, uint16_t hDurationms );
    1 K5 C* ^1 k8 Y# s- o
  15. 7 i! [8 t$ R- g3 q
  16. /* Programs a Torque ramp for Motor 1 */
    3 J4 x) r4 w+ K; S( g$ K
  17. void MC_ProgramTorqueRampMotor1( int16_t hFinalTorque, uint16_t hDurationms );2 C& r" H4 W+ R. \% g1 D; R9 i
  18.   m' v. j  g0 Z5 s
  19. /* Programs a current reference for Motor 1 */0 Q, C6 }9 k( t+ j) w( R& |
  20. void MC_SetCurrentReferenceMotor1( Curr_Components Iqdref );
    / R5 R& W0 G2 Z# t& k  R

  21. ! z% J$ Q1 n+ Y) k& i8 P4 I; X8 M
  22. /* Returns the state of the last submited command for Motor 1 */
    8 }% i5 x7 ?9 K% X8 T% x- t- K
  23. MCI_CommandState_t  MC_GetCommandStateMotor1( void);6 w9 |6 s  H* k% u' E, N
  24. - ~. n! I) o& w- _8 s' }
  25. /* Stops the execution of the current speed ramp for Motor 1 if any */  y; t0 s9 |) A. V; F. M- l( O9 n2 q
  26. bool MC_StopSpeedRampMotor1(void);  o7 `- _0 u4 c6 ?4 m% U/ }/ [6 E
  27. ( E, ]: S* C: I4 [3 i$ L7 O6 @
  28. /* Returns true if the last submited ramp for Motor 1 has completed, false otherwise */
    # _! o( o- n$ n  U3 U, I
  29. bool MC_HasRampCompletedMotor1(void);
    1 }% G% I# n: w5 L

  30.   O8 e4 D$ K$ K) ]' B
  31. /* Returns the current mechanical rotor speed reference set for Motor 1, expressed in dHz (tenth of Hertz) */
    $ j, n8 P' G5 }* x
  32. int16_t MC_GetMecSpeedReferenceMotor1(void);. J& P1 k5 h$ S/ K+ }4 e. `: E

  33. * I9 W& a0 `8 D. I- K9 ]
  34. /* Returns the last computed average mechanical rotor speed for Motor 1, expressed in dHz (tenth of Hertz) */
    0 _% T/ y7 }0 q/ u; n7 z0 ~
  35. int16_t MC_GetMecSpeedAverageMotor1(void);2 f  i# u5 ^4 `% C0 y4 `1 y
  36. $ c' @$ p/ C5 z
  37. /* Returns the final speed of the last ramp programmed for Motor 1, if this ramp was a speed ramp */+ {" s* [) j( @) O( v  x& f
  38. int16_t MC_GetLastRampFinalSpeedMotor1(void);2 b/ k+ ?# t. B5 q( g# j% I" s, g& N
  39. 8 X& Z8 H$ ]5 g7 i6 N1 p. f2 T
  40. /* Returns the current Control Mode for Motor 1 (either Speed or Torque) */' U: t2 J8 O. X( F
  41. STC_Modality_t MC_GetControlModeMotor1(void);$ Z( ^( B' T# C! O  J+ Q

  42. 9 }: U* j4 @( f8 C" m
  43. /* Returns the direction imposed by the last command on Motor 1 */$ F/ V# l% e2 ^( B" N
  44. int16_t MC_GetImposedDirectionMotor1(void);9 J5 B# n) A( ~) [3 J7 Y

  45. & P0 t* O+ r. c, y$ m* I# r
  46. /* Returns the current reliability of the speed sensor used for Motor 1 */4 D8 X0 e, b: V" H5 @
  47. bool MC_GetSpeedSensorReliabilityMotor1(void);' ~  }. r* i! u8 y- C! F9 {
  48. & k0 X  F" O5 h3 i# ~8 B
  49. /* returns the amplitude of the phase current injected in Motor 1 */) F8 [7 c4 _5 }$ F2 T; D$ p
  50. int16_t MC_GetPhaseCurrentAmplitudeMotor1(void);7 h" u' H' I2 A; ^7 C
  51. - T0 M1 k1 D' k* f- b2 E8 a* T% E) C% @5 P
  52. /* returns the amplitude of the phase voltage applied to Motor 1 */$ @* P$ t4 y5 P. @1 o* F
  53. int16_t MC_GetPhaseVoltageAmplitudeMotor1(void);# A& ~0 k& Z7 R7 ?) G8 F9 a# R
  54. " v0 g3 o, r$ U. O5 `
  55. /* returns current Ia and Ib values for Motor 1 */
    6 Y8 M% f% q3 V) F( O/ y$ U' u
  56. Curr_Components MC_GetIabMotor1(void);
    3 V# ^3 h& g/ F+ Y

  57. 4 v  N' z# T5 H" o; v8 N
  58. /* returns current Ialpha and Ibeta values for Motor 1 */& r( f" {" @- e9 L, v
  59. Curr_Components MC_GetIalphabetaMotor1(void);0 g& u% V' A  l/ V0 u% {
  60. - T1 j8 l3 C$ w1 d7 j
  61. /* returns current Iq and Id values for Motor 1 */
    # J; i; y1 V( q/ B/ }7 b* L
  62. Curr_Components MC_GetIqdMotor1(void);+ H" ]* s, ~+ T+ b8 s$ s

  63. & t6 e  h* d% j3 F1 T) l1 v
  64. /* returns Iq and Id reference values for Motor 1 */
    6 J* s" ]3 o0 _
  65. Curr_Components MC_GetIqdrefMotor1(void);+ G9 n7 R' u, G

  66. + C9 T* b3 O* R$ k/ x6 d
  67. /* returns current Vq and Vd values for Motor 1 */
    ; }* x! s! a" m6 w9 Y
  68. Volt_Components MC_GetVqdMotor1(void);
    0 s. s+ ~; ^6 G) w2 o/ g* B( B
  69.   x/ ^9 ]* ]" C& s$ e& }$ `
  70. /* returns current Valpha and Vbeta values for Motor 1 */7 c0 o) ^" p/ A4 R
  71. Volt_Components MC_GetValphabetaMotor1(void);6 K+ _" `, |( R& F  x7 g

  72. / V+ o6 @/ G! _: J  ]: r
  73. /* returns the electrical angle of the rotor of Motor 1, in DDP format */
    8 H, y+ k! K  _9 m  o
  74. int16_t MC_GetElAngledppMotor1(void);4 J* n; x" H% \2 ^7 ]. p
  75. ! @7 G8 }7 d/ Z4 v; N+ v1 b
  76. /* returns the current electrical torque reference for Motor 1 */
    + ^# P5 j5 q, M$ z  t! s9 ?  E
  77. int16_t MC_GetTerefMotor1(void);: Q! s( b! E0 @
  78. ( n  d# V. o8 B, F
  79. /* Sets the reference value for Id */
    ' ]$ }' a0 d% u1 V% p. |
  80. void MC_SetIdrefMotor1( int16_t hNewIdref );
    % T: `: N$ X7 m: |$ |7 s0 c& Y) X

  81.   w, K* J; G3 q+ r3 Y* x
  82. /* re-initializes Iq and Id references to their default values */
    6 o' F. U% w- [% W
  83. void MC_Clear_IqdrefMotor1(void);( y) O; {9 }  `: t/ _  l4 L
  84. . [! b: k& G( y$ k6 x
  85. /* Acknowledge a Motor Control fault on Motor 1 */
    " o) U5 h3 Q* q9 V1 M6 i( E* [
  86. bool MC_AcknowledgeFaultMotor1( void );
    1 M. `; o6 |, W

  87. ; |/ w1 T1 p; Y( F
  88. /* Returns a bitfiled showing faults that occured since the State Machine of Motor 1 was moved to FAULT_NOW state */
    8 `% Y3 G3 Y9 g
  89. uint16_t MC_GetOccurredFaultsMotor1(void);
    3 C, _7 Z. N* H/ b" A6 Q0 m  D  Q7 G
  90. 3 w2 c9 k3 h, Q( i% O
  91. /* Returns a bitfield showing all current faults on Motor 1 */# o7 q' f0 }( v, W5 S2 S
  92. uint16_t MC_GetCurrentFaultsMotor1(void);2 A- `+ c' ?2 g, T' b

  93. / b* g9 V; M' t+ g6 C+ u1 m4 R7 n
  94. /* returns the current state of Motor 1 state machine */9 s$ A1 p0 e/ J1 B
  95. State_t  MC_GetSTMStateMotor1(void);5 K. @! ^8 `% c0 J* j5 E
  96. ( b6 S. y. k. I# \
  97. /* programs a user defined ADC regular conversion */
    ; g- G; o' x3 o1 q% z' W5 Q" k
  98. void MC_ProgramRegularConversion(uint8_t bChannel, uint8_t bSampleTime);$ j+ e5 G& O7 Q/ W

  99. ' W) C: [  \7 A3 P
  100. /* Returns the value of the last executed user defined ADC regular conversion */2 m2 b# o( Z1 V) |# z. X4 C
  101. uint16_t MC_GetRegularConversionValue(void);# P! H5 a+ X4 ?/ r
  102. ' Q* e& F; _- @3 e9 C8 V  C
  103. /* Returns the status of the last requested user defined ADC regular conversion */6 `  @' A: P% Z$ u
  104. UDRC_State_t MC_GetRegularConversionState(void);
复制代码
上面这些api函数是对单个电机的操作,包含了启动、调速、调转矩、以及电机各种状态的获取。
看了任务一的要求,个人认为电机控制还是需要与外部交互好一点,电机启停不可控对于大功率的电机控制来说比较危险。
任务一代码:
  1. void task_1(void)/ U- P! r" T5 \. l: P
  2. {
    . W; J- V9 x* D: Q0 t
  3.     MC_ProgramSpeedRampMotor1(3000/6,1000);
    # n7 e2 G5 }, S& F0 F# I$ T- g6 I
  4.     MC_StartMotor1();% v  s5 c; }$ v2 c- C
  5.     HAL_Delay(10000);
    ( F9 M8 Y% j9 C: C; l: s
  6.     MC_StopMotor1();0 V. _2 s) y( X. `% X) W
  7.     HAL_Delay(10000);
    7 h8 ~* x% t- Q' A% v9 b/ e$ G$ k
  8. }
复制代码
主函数添加的代码:
  1. /* Infinite loop */! u7 k' ]2 A5 G  K, C
  2.   /* USER CODE BEGIN WHILE */
    2 ~( t& d" u9 ?- V; F# g4 V; S
  3.   while (1)' v+ d3 `: f2 y0 J* v: @$ w4 |
  4.   {
    : e3 `+ ]% D1 i$ n7 T8 G
  5.       , L/ U) B+ T9 X: X% w
  6.       if(GPIO_PIN_SET == HAL_GPIO_ReadPin(LED11_GPIO_Port,LED11_Pin))6 B7 m" T/ g$ @& X4 i' ]- {' O; l
  7.       {
    : t8 z3 }. K: q9 z8 r0 I5 [
  8.               task_1();
    4 S1 S7 e% p- w  v% |
  9.       }% F  S) ^9 y$ F+ W* o
  10.       else( q4 B* W$ N- p: J9 F: N5 B  v* B
  11.       {+ m" {3 q' }" V5 Y9 p
  12.             MC_StopMotor1();
    ( L* b8 v! i3 Z  n6 n3 J- t- A# C
  13.       }+ }3 K  g% d  I# E1 x$ m1 j2 k
  14.       realspeed = MC_GetMecSpeedAverageMotor1()*6;
    , r8 H$ r* |( u+ y5 ^" z
  15.   /* USER CODE END WHILE */
复制代码
按键中断处理函数代码在ui_task.c这个文件中:
  1. void UI_HandleStartStopButton_cb (void)
    ; J; r7 a, s( `0 N' q' O
  2. {, Z2 A/ Y7 y& [( Z) e
  3. /* USER CODE BEGIN START_STOP_BTN */: C* F  `" l+ ]7 o) P
  4.   HAL_GPIO_TogglePin(LED11_GPIO_Port,LED11_Pin);* Z1 U- N  e1 a- ^
  5. /* USER CODE END START_STOP_BTN */0 h8 F8 U% e  N! A3 O# s
  6. }
    % Y" ^7 t6 u* W- t, R8 ]% m
复制代码
这样可以通过按键来控制任务的运行并且可以通过led的亮灭来观察系统所处的状态。LED11是驱动板上的一颗led,引脚号是PB2,可以通过cubemx来设置初始化代码。
通过monitor可以看到速度变化曲线图:
任务一速度变化截图.png
ok,任务一完成。
-------------------------------------------------------------
) h2 o  e5 C( {4 ?
任务二代码:
  1. void task_2(void)* q& J' `3 M9 O$ r1 k
  2. {& g% J2 C  @. q: j- G
  3.         int16_t Speed_Kp,Speed_Ki;
    ! S' h4 u6 n6 f5 P- W
  4.         MCT_Handle_t * pMctHdl;* I9 n6 I7 S2 p% E( ^
  5.         MC_ProgramSpeedRampMotor1(3000/6,1000);1 P9 Z3 c& g. V2 ^1 \; ~8 }
  6.         MC_StartMotor1();; [" e! _) ?: ^" v# g
  7.         HAL_Delay(3000);* B3 U0 u' Z7 e% T. o
  8.         MC_StopMotor1();
    2 K2 Y6 U6 v- r
  9.         HAL_Delay(1000);
    3 H' e8 O( d' }! p
  10.      pMctHdl = GetMCT(M1);8 n7 d% c  @5 L+ Y. |: L7 G
  11.      Speed_Kp = PID_GetKP(pMctHdl->pPIDSpeed);
    % |( F; T+ H. ~- J( S$ d
  12.      Speed_Ki = PID_GetKI(pMctHdl->pPIDSpeed);0 ^, z0 L4 d$ C: D# K7 }1 m8 |
  13.      PID_SetKP(pMctHdl->pPIDSpeed,Speed_Kp*2);2 |, k" v! ~+ |8 t  p
  14.      PID_SetKI(pMctHdl->pPIDSpeed,Speed_Ki*2);
    / z' O; g+ X) U9 p8 ?3 x6 i
  15.      MC_ProgramSpeedRampMotor1(3000/6,1000);/ b9 U& ]8 S5 B7 k
  16.      MC_StartMotor1();
    7 L( j( C' P+ C/ Q
  17.      HAL_Delay(3000);0 N4 T5 ?7 Q# }& ~. c% H
  18.      MC_StopMotor1();0 h; ?$ o. z- h4 P6 c! C
  19.      HAL_Delay(1000);
    % |: p5 J( Q( H& v
  20.      PID_SetKP(pMctHdl->pPIDSpeed,Speed_Kp/2);
    0 i! A4 w4 b$ R5 ^4 P* W
  21.      PID_SetKI(pMctHdl->pPIDSpeed,Speed_Ki/2);
    / j% C/ s+ p4 `( Z
  22.      MC_ProgramSpeedRampMotor1(3000/6,1000);
    & b5 i* q, T+ D' m. j
  23.      MC_StartMotor1();1 a  G3 t2 D1 j3 @* n
  24.      HAL_Delay(3000);
    7 i0 L+ \! T: M" m' M
  25.      MC_StopMotor1();   8 C8 `1 a& Y* r: w; i
  26.         HAL_GPIO_WritePin(LED11_GPIO_Port,LED11_Pin,GPIO_PIN_RESET);! m1 T0 h+ n( d" W, [3 Z
  27. }
复制代码
主函数代码和任务一相同,只是把task_1()改成task_2()就行了。最后一行把LED引脚拉低是为了让代码只运行一次,多次运行可以通过按键进行操作。
任务2速度截图.png
可以看到和预期结果是一致的,原始PI调节速度快,有超调现象;Kp、Ki同时增大一倍的时候,调节加快了,并且超调现象被抑制了;当Kp、Ki同时缩小一倍时可以看到虽然调节很快,但是有严重的超调现象。
9 O" H6 R" s. s6 K) o# ?5 x

" C( a# V" x" W6 E/ S7 e
通过monitor的图形显示速度波形极大的方便调试PID的过程,ST考虑得真周到。

0 N( b% O1 g% S; V/ M/ k
我在这里有个疑问,这个plotter只能显示参考速度的波形吗,还能不能添加其他变量来查看系统某个变量的变化趋势呢。之前我一直是用的Jscope,但是Jscope需要连接Jlink来查看,对于这款套件来说需要额外连接Jlink调试器,有一点点麻烦。后面调试有必要我还是会使用Jscope来查看一些变量的波形,并且分享到论坛。 * ?' Q  U% L# u) ~' S9 U+ o( W

' [5 K) m0 f: C, i/ Y+ P: P
任务一和任务二已完成,欢迎大家留言讨论。
, C) B; {/ Z$ f/ K: S! x# H

2 I5 ?9 h' q$ w2 r+ }+ J, r, X1 K3 H! _

/ P3 M( O' ]# I  r4 s  K; M) b) E, H+ a% ]
赞 收藏 2 评论27 发布时间:2018-9-2 10:18

举报

27个回答
子曰好人 回答时间:2019-7-23 09:13:07
jeff1996 发表于 2019-7-22 16:34
' P  [" y; @/ v$ R5 T楼主。 我按照你任务1的程序。 但是我的电机加速到3000RPM需要10多秒。 怎么设置都是10多秒,很奇怪。 请问 ...
/ R! h6 X  ^) P( ^$ ^
/* Programs a Speed ramp for Motor 1 */
0 d: _# a, P  ^7 Dvoid MC_ProgramSpeedRampMotor1( int16_t hFinalSpeed, uint16_t hDurationms );
9 k9 j$ I8 ~2 y# I+ f1 j这个函数的第二个参数你改过吗,第二个参数就是达到目标值的时间,越小加速度越快8 c) v7 d- G7 }  \; I1 {

) A  _- Y& U9 G* v) ]考虑另外一个问题,电机惯性较大,电机驱动板的驱动能力有限,也许最多就只能10+s才能达到目标转速
子曰好人 回答时间:2019-3-13 10:16:47
gatsby32 发表于 2019-3-13 09:42
* T2 z9 O. E9 ~- G7 v6 i5 w老哥  这个task是写在main函数里面吗  ?这个按键中断有什么作用啊?麻烦老哥给我解解惑,第一次学这些 很 ...

1 Y2 y: a4 c- C3 \1.在我的程序里按键的作用起的是传递信号的作用,按键中断中翻转LED11引脚,主函数通过读取LED11引脚电平值做是否启动任务的判断。
7 S2 ]. q9 J( y2.在我的代码里启停是可控的,通过LED11引脚电平来判断是否执行task1。另外,task1的要求就是延时不断启停,我这样写是没有问题的
子曰好人 回答时间:2019-3-28 17:05:01
gatsby32 发表于 2019-3-28 16:52
4 k. `; P2 r2 y0 d老哥 这两个函数的内容不一样 ,为了完成实验一 我需要把这个内容改成和你一样的吗9 c* w) _+ E# l/ D" G$ F
...

  F/ k  X" \# E1 }8 D直接扔好几个问题,还没完全看过来
6 d3 L( Y# K4 A" g回复20#和21#:4 G) _; p5 u3 `2 M9 ?, b* {: o
User_label那个自己想写什么名字无所谓,根据自己喜好就OK
' }5 }' y* U( _: l/ G  U4 d1 L回复22#和23#:
! P) y5 j: {- Y! g# A2 L. B3 y不用跟我的代码完全一样,这个只是我用于控制实验进行与否的一种方式,你也可以通过其他方式来做2 l. B. e7 J4 ^6 U! g* c6 G
freeelectron 回答时间:2018-9-2 18:27:19
这个只显示了速度波形,其实要想显示更多东西,就在通讯协议里面加就好了,ST这个是串口的,板子和上位机通讯协议已经固定了,想要显示更多可以自己搞个上位机;
+ j; Q/ H$ W7 |2 J
子曰好人 回答时间:2018-9-2 19:05:16
freeelectron 发表于 2018-9-2 18:27
9 o0 f' R9 Y* X* d这个只显示了速度波形,其实要想显示更多东西,就在通讯协议里面加就好了,ST这个是串口的,板子和上位机通 ...

" a4 Z3 [& X5 ~8 z( A* j9 L& a; S好的,有时间我去了解一下通讯协议的代码,尝试显示其他变量。另外一个就是觉得plotter采样率有点低,Jscope采样率1kHz在好些时候都显得不太够用。
FF_胖子 回答时间:2018-9-14 09:20:41
这套板最大可以承受多大的电压,官方给的不是8-48V吗,但是我的刚到40V下面那个nucle板就烧了2 w5 E" x4 \" v9 h# z
子曰好人 回答时间:2018-9-14 09:29:48
ff321 发表于 2018-9-14 09:20
- M+ t" X* \( M  _这套板最大可以承受多大的电压,官方给的不是8-48V吗,但是我的刚到40V下面那个nucle板就烧了
- C- b+ v  a% W! o) D0 X# T ...

0 a( d+ w- r( C0 G3 Q' V! `我没试过其他电压,一直用的12V,你是不是正负极接反了
FF_胖子 回答时间:2018-9-14 09:47:12
子曰好人 发表于 2018-9-14 09:298 |- B1 R2 n) b& r& N2 G
我没试过其他电压,一直用的12V,你是不是正负极接反了
! X2 g) O' |0 o3 j
不是,我是从24V慢慢升上去的,
子曰好人 回答时间:2018-9-14 10:04:26
ff321 发表于 2018-9-14 09:47
0 G7 R* I/ a' b; A3 G0 [7 Q不是,我是从24V慢慢升上去的,

5 F( W9 U9 l; ^5 r! ~2 V: i; M6 l我后面尝试一下高电压再给你反馈吧,主要是现在我也没有高电压的电机,所以一直用的12V
FF_胖子 回答时间:2018-9-14 10:57:54
子曰好人 发表于 2018-9-14 10:04
  p" K) c! i' g我后面尝试一下高电压再给你反馈吧,主要是现在我也没有高电压的电机,所以一直用的12V ...

  k5 x- P6 R1 k, y) d1 i$ j好的,还是小心点吧
子曰好人 回答时间:2018-9-14 18:52:52
ff321 发表于 2018-9-14 10:57
9 j; `8 ~' H: p7 d好的,还是小心点吧

! |8 r( Q/ t( p* I2 ?) ?6 A上电40V驱动板坏了,底板还是好的,这个可能需要告知一下ST了
VernonBacon 回答时间:2018-9-19 09:21:24
freeelectron 发表于 2018-9-2 18:27
/ o8 w! \3 b3 R0 Z- l# ^# Z6 C这个只显示了速度波形,其实要想显示更多东西,就在通讯协议里面加就好了,ST这个是串口的,板子和上位机通 ...
  A1 j) c5 a- }+ g4 ]0 Q
板子和上位机通讯协议是啥
子曰好人 回答时间:2018-9-19 09:37:38
vernonvb 发表于 2018-9-19 09:21
4 E1 {2 \! O6 x% d9 c+ X0 _板子和上位机通讯协议是啥
" g5 T( R& v7 `) m7 x, _7 p
我还没看,你可以去串口中断函数中了解通信协议
mozartc 回答时间:2018-9-20 13:21:39
MCT_Handle_t* 这个类型的指针,会报错,没有定义,然后我加上mc_tuning.h就可以了,楼主你有遇到吗?
子曰好人 回答时间:2018-9-20 14:08:31
mozartc 发表于 2018-9-20 13:21" G( W4 |, V& b  y
MCT_Handle_t* 这个类型的指针,会报错,没有定义,然后我加上mc_tuning.h就可以了,楼主你有遇到吗? ...

+ X0 [; h; ?- J正常呀,这属于C语言基本功,MCT_Handle_t这个结构体在mc_tuning.h中定义的,你要在其他文件中使用当然要包含定义这个结构体的头文件嘛
mozartc 回答时间:2018-9-20 14:12:20
子曰好人 发表于 2018-9-20 14:08+ j' W/ k0 g$ N7 D$ [
正常呀,这属于C语言基本功,MCT_Handle_t这个结构体在mc_tuning.h中定义的,你要在其他文件中使用当然要 ...
$ V1 c' S5 b. Z4 M
那就好,我还以为是我工程建立的有问题
gatsby32 回答时间:2019-3-11 10:49:32
老哥  cubemax怎么初试化引脚啊,你能把你的任务一和任务二的工程发给我我吗,我不知道task这些函数要添加在哪里 ,我以前没学过这些东西 ,是个菜鸟 ,望老哥多多指教啊
12下一页

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版