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

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

[复制链接]
子曰好人 发布时间:2018-9-2 10:18
本帖最后由 子曰好人 于 2018-9-2 10:21 编辑
2 y* X2 Z' l; ^! M
  \8 _9 V7 ~- g5 x  C8 A: k3 j2 S. v
经过前期的准备,可以使用电机套件完成一些实验任务了。
首先是任务1和任务2的要求:
task1.png
task2.png
任务一和任务二基于workbench生成的代码来做并不难,因为代码里面提供了很多api函数并且做了很多软件上的保护,可以放心写代码,硬件不会那么容易损坏。

* g8 ]/ G+ D" Q0 L7 b0 }1 ^
拿到一份陌生的代码除了了解我前面几篇帖子所说的内容外,在开始写代码前还需要了解api函数。我们可以打开mc_api.h看一看workbench都给我们提供了什么函数。
7 }4 b; K/ [; R. y( ~4 W
  1. /** @addtogroup MCIAPI5 |4 h2 {) D; ]. s! C" j' H
  2.   * @{
    : l( d( c. o. H4 @/ y1 A
  3.   */( |2 Q5 h9 v& k5 f3 N0 k

  4. 3 p2 V8 g+ H% w" S! T0 u0 c
  5. typedef enum {UDRC_STATE_IDLE, UDRC_STATE_REQUESTED, UDRC_STATE_EOC} UDRC_State_t;" Z" H" \! u6 G
  6. 7 u- D; r" H$ c7 w+ k
  7. /* Starts Motor 1 */
    + A, [: B' E: C5 ?5 a
  8. bool MC_StartMotor1(void);
    0 h' W0 y+ A' ?" l) M% L9 G
  9. ) T! e& B/ {- v- w2 }
  10. /* Stops Motor 1 */, t9 ^5 H* X* T: D! Q) y
  11. bool MC_StopMotor1(void);/ M6 a* S" L5 u- v
  12. ) A2 p! m$ V- X4 Z4 C
  13. /* Programs a Speed ramp for Motor 1 */
    1 M3 ~' Z* u' U( X1 f% h$ ^$ r% i7 u; N8 w
  14. void MC_ProgramSpeedRampMotor1( int16_t hFinalSpeed, uint16_t hDurationms );9 B! V$ c* Y) a5 [

  15. % J2 ]$ F5 @/ `  o* p9 L5 c0 n
  16. /* Programs a Torque ramp for Motor 1 */
    4 B7 }+ b3 H, d) T% N
  17. void MC_ProgramTorqueRampMotor1( int16_t hFinalTorque, uint16_t hDurationms );+ [! Y# P; j0 `
  18. 8 a4 E" B- g! W- L1 d, d. D9 W
  19. /* Programs a current reference for Motor 1 */
    4 W$ h* v$ c4 d
  20. void MC_SetCurrentReferenceMotor1( Curr_Components Iqdref );
    4 i! F0 s1 p# x" }

  21. 6 F2 E! ~# W  R% A* i9 E! m/ n
  22. /* Returns the state of the last submited command for Motor 1 */1 G" D% I( I; x% M( [1 K- d
  23. MCI_CommandState_t  MC_GetCommandStateMotor1( void);
    $ d& B5 Q, y: S( t0 r" T& o

  24. 0 Y' K# s) g- N) ]( r' q
  25. /* Stops the execution of the current speed ramp for Motor 1 if any *// s2 N5 f+ ^# \
  26. bool MC_StopSpeedRampMotor1(void);
    $ E: Z4 i/ H# W
  27. ) Y8 c3 V! O5 \2 n+ b! k
  28. /* Returns true if the last submited ramp for Motor 1 has completed, false otherwise */
    , P' [$ U! `9 Q
  29. bool MC_HasRampCompletedMotor1(void);
    0 D: j' G2 m$ z* x* s& f

  30. : v4 G- b9 u9 [8 u
  31. /* Returns the current mechanical rotor speed reference set for Motor 1, expressed in dHz (tenth of Hertz) */+ W9 a8 Q7 y. X* K
  32. int16_t MC_GetMecSpeedReferenceMotor1(void);
    ) N% A; n8 h3 o; b' i. p0 S. }  d, |
  33. $ b6 @4 i1 \1 R0 {/ o( s( ~$ q, l
  34. /* Returns the last computed average mechanical rotor speed for Motor 1, expressed in dHz (tenth of Hertz) */
    - v  u) ?" H6 ]! B7 s6 t
  35. int16_t MC_GetMecSpeedAverageMotor1(void);
    2 Q0 T- M* K- v# |. ^* E$ ^

  36. : @2 Y! L; q0 {) D
  37. /* Returns the final speed of the last ramp programmed for Motor 1, if this ramp was a speed ramp */& ~7 G( D( K7 Y3 k" g
  38. int16_t MC_GetLastRampFinalSpeedMotor1(void);' K5 m" G9 o  F% Y6 a* i
  39. & d! A! r+ P4 ?5 q
  40. /* Returns the current Control Mode for Motor 1 (either Speed or Torque) */
    ' I7 A, g  |; E: O* [% Q, I8 B- g8 b
  41. STC_Modality_t MC_GetControlModeMotor1(void);' _: n& H" s* N2 E* {6 f# V

  42. 9 B9 g% c" U2 i& H8 `1 }
  43. /* Returns the direction imposed by the last command on Motor 1 */
    6 Y5 o8 I3 m( N! m8 J) c2 M
  44. int16_t MC_GetImposedDirectionMotor1(void);
    ' V% J8 y; z: l2 q  s* k

  45. # f  K, t7 H" @* J1 c- k
  46. /* Returns the current reliability of the speed sensor used for Motor 1 */
    $ @7 }# f1 l2 I9 n
  47. bool MC_GetSpeedSensorReliabilityMotor1(void);4 I2 M8 m1 T2 B, k
  48. . J- b1 M& g: i3 O
  49. /* returns the amplitude of the phase current injected in Motor 1 */: ]9 ?/ ^- u. k$ m/ p5 ~
  50. int16_t MC_GetPhaseCurrentAmplitudeMotor1(void);  h9 L% n+ S( B; V& N6 x7 X

  51. + F9 C' I" v9 n' }- S4 [/ i+ D/ Y7 d
  52. /* returns the amplitude of the phase voltage applied to Motor 1 */
    - A* V5 ?. j$ }" |+ a- N' M" k
  53. int16_t MC_GetPhaseVoltageAmplitudeMotor1(void);; @3 ]  P) C" x! X. M
  54. / V: F5 y9 v2 B3 R+ h
  55. /* returns current Ia and Ib values for Motor 1 */, S/ f, [0 }9 G# Z% k
  56. Curr_Components MC_GetIabMotor1(void);9 u# P7 }: l+ A" S6 v

  57. ( Q3 S& {9 k: j  C) k% @: D
  58. /* returns current Ialpha and Ibeta values for Motor 1 */
    ' Z  \: `* v3 m
  59. Curr_Components MC_GetIalphabetaMotor1(void);& C. Q; H4 s6 f" l2 X
  60. 6 f& V9 ]6 f9 u# O
  61. /* returns current Iq and Id values for Motor 1 */3 S2 j8 W# L! v9 r; P
  62. Curr_Components MC_GetIqdMotor1(void);3 ~! C  g, u) C2 K- c; `3 m

  63. 6 f5 m4 V. o; [
  64. /* returns Iq and Id reference values for Motor 1 */
    ; J3 I+ F, U- w5 z7 C& E! A2 y) I/ _
  65. Curr_Components MC_GetIqdrefMotor1(void);
    / s  w( G" Q3 q% e
  66. $ W- \% ?' a) B8 Q6 M$ t
  67. /* returns current Vq and Vd values for Motor 1 */
    , x8 W% _2 b; Q& \
  68. Volt_Components MC_GetVqdMotor1(void);
    6 D; w# a. T- E; E6 b3 a, `4 l1 e

  69. 9 D6 K" j, V8 t! i( Q; X
  70. /* returns current Valpha and Vbeta values for Motor 1 */: q  E- p. D! D* i
  71. Volt_Components MC_GetValphabetaMotor1(void);
    1 O( o2 a4 V, O8 T# d

  72. 6 D; O5 A& N4 r$ _8 d- ~
  73. /* returns the electrical angle of the rotor of Motor 1, in DDP format */" k  V/ P' q  ^8 L+ ?7 d
  74. int16_t MC_GetElAngledppMotor1(void);" u& v( P, c. I4 S( x
  75. 4 {) }7 q9 h5 \! T+ H, @
  76. /* returns the current electrical torque reference for Motor 1 */
    $ |0 v( O% D! F2 q7 X
  77. int16_t MC_GetTerefMotor1(void);
    4 |9 m! ~6 V, U. [- S) `5 |
  78. : O% M3 J+ n* A* _' }1 |* E
  79. /* Sets the reference value for Id */9 o/ g" z  x$ x  V- w7 H" N
  80. void MC_SetIdrefMotor1( int16_t hNewIdref );
    # V% L3 _9 M  I, h7 p& a
  81. 9 E3 m, t9 y  U4 }
  82. /* re-initializes Iq and Id references to their default values */, a/ b; p" B# A8 Z0 b: ?
  83. void MC_Clear_IqdrefMotor1(void);0 L! @5 \+ v, P# _1 P
  84. 3 J0 ?; m% m7 q
  85. /* Acknowledge a Motor Control fault on Motor 1 */% T4 U- `+ M# |' n: Y- J
  86. bool MC_AcknowledgeFaultMotor1( void );, ?6 v1 j' [$ c* w9 u
  87. 9 a! V- @1 `2 O. z
  88. /* Returns a bitfiled showing faults that occured since the State Machine of Motor 1 was moved to FAULT_NOW state */
    6 n+ |/ ]. S# P; ~7 c5 V
  89. uint16_t MC_GetOccurredFaultsMotor1(void);
    ; M. V% w. o  L5 _
  90. 7 J2 O, I+ G9 e, }% b
  91. /* Returns a bitfield showing all current faults on Motor 1 */
    6 i* N: W7 h  g: ^- p
  92. uint16_t MC_GetCurrentFaultsMotor1(void);
    " z: {9 I0 B- b% o; i/ b
  93. / Q8 v0 _( w8 b% o
  94. /* returns the current state of Motor 1 state machine */
    9 H$ \. }5 r5 V0 d3 o' r8 Y
  95. State_t  MC_GetSTMStateMotor1(void);: @" }9 U5 \! a( W. {

  96. 9 I; }" S' g9 W* Z( N1 h
  97. /* programs a user defined ADC regular conversion */2 B3 t& `# `/ T5 I2 P
  98. void MC_ProgramRegularConversion(uint8_t bChannel, uint8_t bSampleTime);
    0 _: h" l' ~5 G' p, g2 L$ M2 O
  99. 0 ]* h0 v( G' S5 t0 l# F  n6 r0 |
  100. /* Returns the value of the last executed user defined ADC regular conversion */
    6 W+ ?$ ?* Z8 S, n3 @+ y
  101. uint16_t MC_GetRegularConversionValue(void);: e. c# I3 K% Q$ t( P5 x

  102. 7 @) ]' Q7 X, X: C8 ^
  103. /* Returns the status of the last requested user defined ADC regular conversion */6 S5 ]. R. x- j+ p7 n$ s# e/ D
  104. UDRC_State_t MC_GetRegularConversionState(void);
复制代码
上面这些api函数是对单个电机的操作,包含了启动、调速、调转矩、以及电机各种状态的获取。
看了任务一的要求,个人认为电机控制还是需要与外部交互好一点,电机启停不可控对于大功率的电机控制来说比较危险。
任务一代码:
  1. void task_1(void)5 |7 A3 N+ S$ n$ P$ M% @; V% y
  2. {
    * e# N5 I! @; T
  3.     MC_ProgramSpeedRampMotor1(3000/6,1000);' a+ ]& X" D0 f8 i! h
  4.     MC_StartMotor1();" T( n4 ]% X: |, \* ?
  5.     HAL_Delay(10000);( g! {+ j9 q& d
  6.     MC_StopMotor1();
    3 w" ~5 C! K8 l
  7.     HAL_Delay(10000);
    " m; E. P& w" Y% x: A- c+ P
  8. }
复制代码
主函数添加的代码:
  1. /* Infinite loop */0 e2 N9 T& R0 F/ K
  2.   /* USER CODE BEGIN WHILE */
    : T5 c8 f+ G& |1 p4 Q1 e" l- ^
  3.   while (1)
    % s' @5 F. A2 r
  4.   {1 Z1 d: t: z. d0 \  h/ K$ `9 Z
  5.       ( x$ ~$ W5 b8 E4 ^+ T" ~
  6.       if(GPIO_PIN_SET == HAL_GPIO_ReadPin(LED11_GPIO_Port,LED11_Pin))
    4 c) n: A- t& }2 T! `, @
  7.       {1 |. k! l! |) G! n3 ~
  8.               task_1();7 Q9 B# Y* i  R: T! |  e; W2 g
  9.       }) x; I+ x, f" p$ J- @. W7 ~# X" w
  10.       else
    * s! S: o7 H% y1 L" X4 e$ q8 v
  11.       {" u  v  ]: l1 b5 m; D
  12.             MC_StopMotor1();
    / v! p% T+ }8 p( v# k. i& u
  13.       }( K/ ^0 z# N! @$ B" K( [! y
  14.       realspeed = MC_GetMecSpeedAverageMotor1()*6;1 O) N  G% a0 U, j* j7 z' h
  15.   /* USER CODE END WHILE */
复制代码
按键中断处理函数代码在ui_task.c这个文件中:
  1. void UI_HandleStartStopButton_cb (void)
    . n; N2 }( O, D! J. A8 T
  2. {! }5 A( c% N% p
  3. /* USER CODE BEGIN START_STOP_BTN */
    0 w' n3 t# o3 x  V# Q
  4.   HAL_GPIO_TogglePin(LED11_GPIO_Port,LED11_Pin);) a# v0 Y+ W8 ]
  5. /* USER CODE END START_STOP_BTN */0 V: k. \) E, L8 S0 [5 A( E6 ?# ]
  6. }
    4 f1 Y3 N/ E* s% x, w! U: T
复制代码
这样可以通过按键来控制任务的运行并且可以通过led的亮灭来观察系统所处的状态。LED11是驱动板上的一颗led,引脚号是PB2,可以通过cubemx来设置初始化代码。
通过monitor可以看到速度变化曲线图:
任务一速度变化截图.png
ok,任务一完成。
-------------------------------------------------------------
- Y6 V; d" O' c
任务二代码:
  1. void task_2(void)1 N) d8 `7 u" m% U) Y' u
  2. {4 S+ W% o" X7 W8 [. t  {# `
  3.         int16_t Speed_Kp,Speed_Ki;& i  x& Z, N: w
  4.         MCT_Handle_t * pMctHdl;, J, e& \" j& @0 r! t% |
  5.         MC_ProgramSpeedRampMotor1(3000/6,1000);" F/ M  T7 J6 G1 {$ R5 R5 |
  6.         MC_StartMotor1();$ Z2 F5 m7 }- \0 ]: s, ?6 ~8 u8 I
  7.         HAL_Delay(3000);; l0 Y- _' n+ e" i/ P+ J% g
  8.         MC_StopMotor1();1 |1 v( S7 u$ y' D8 i( h$ P
  9.         HAL_Delay(1000);
    1 ?' A# X3 g- a9 S  N
  10.      pMctHdl = GetMCT(M1);7 \, q4 b( ?9 _( k; b, ~
  11.      Speed_Kp = PID_GetKP(pMctHdl->pPIDSpeed);
    . h/ O! o0 j4 @6 G
  12.      Speed_Ki = PID_GetKI(pMctHdl->pPIDSpeed);8 w% x5 P0 J3 A1 x5 T; y' ^3 W
  13.      PID_SetKP(pMctHdl->pPIDSpeed,Speed_Kp*2);, X  y( i( a5 i  k
  14.      PID_SetKI(pMctHdl->pPIDSpeed,Speed_Ki*2);; V8 {, g* \8 q* n9 k; |
  15.      MC_ProgramSpeedRampMotor1(3000/6,1000);7 ]. f( f$ ?$ N) U$ j$ O& S7 A
  16.      MC_StartMotor1();
    * k# g5 l+ i1 e' W: n* q0 K) c
  17.      HAL_Delay(3000);7 K4 V$ B3 I6 {8 C6 q
  18.      MC_StopMotor1();
      y1 T8 N. m" ?2 g* k; q
  19.      HAL_Delay(1000);4 `: Q0 R* \+ h7 y( |7 T4 v
  20.      PID_SetKP(pMctHdl->pPIDSpeed,Speed_Kp/2);
    1 s6 m3 p0 M8 v; c3 B
  21.      PID_SetKI(pMctHdl->pPIDSpeed,Speed_Ki/2);
    * T- V( L8 U( y- }1 Q
  22.      MC_ProgramSpeedRampMotor1(3000/6,1000);# T2 ~  B/ Q5 R0 d' p  R7 x) L% P
  23.      MC_StartMotor1();
    + g2 r3 F7 `# ~( y
  24.      HAL_Delay(3000);$ Z5 A3 k8 }; e+ |5 M" r
  25.      MC_StopMotor1();   
    $ l  q) b+ O, d  c
  26.         HAL_GPIO_WritePin(LED11_GPIO_Port,LED11_Pin,GPIO_PIN_RESET);
    * x! u2 h1 U* L: I, U
  27. }
复制代码
主函数代码和任务一相同,只是把task_1()改成task_2()就行了。最后一行把LED引脚拉低是为了让代码只运行一次,多次运行可以通过按键进行操作。
任务2速度截图.png
可以看到和预期结果是一致的,原始PI调节速度快,有超调现象;Kp、Ki同时增大一倍的时候,调节加快了,并且超调现象被抑制了;当Kp、Ki同时缩小一倍时可以看到虽然调节很快,但是有严重的超调现象。 / n; G7 d! c) J
2 _1 ?2 k+ {' p
通过monitor的图形显示速度波形极大的方便调试PID的过程,ST考虑得真周到。

6 N: Y. V/ @' U5 o' E  i; _
我在这里有个疑问,这个plotter只能显示参考速度的波形吗,还能不能添加其他变量来查看系统某个变量的变化趋势呢。之前我一直是用的Jscope,但是Jscope需要连接Jlink来查看,对于这款套件来说需要额外连接Jlink调试器,有一点点麻烦。后面调试有必要我还是会使用Jscope来查看一些变量的波形,并且分享到论坛。
& z. O/ i( Z) n  N9 s
  N8 F! ]* v+ x( O
任务一和任务二已完成,欢迎大家留言讨论。$ T7 C* n$ j9 p4 c

! m  m) m# G, U2 k2 Y
5 C* }) h+ K" j" P; g* a" K! u- s. K
0 I4 E% m9 A8 M' \0 R/ G
收藏 2 评论27 发布时间:2018-9-2 10:18

举报

27个回答
子曰好人 回答时间:2019-7-23 09:13:07
jeff1996 发表于 2019-7-22 16:342 p5 j! `( m8 e3 j$ ?
楼主。 我按照你任务1的程序。 但是我的电机加速到3000RPM需要10多秒。 怎么设置都是10多秒,很奇怪。 请问 ...
& M7 A5 b. E! d3 K( h
/* Programs a Speed ramp for Motor 1 */" [, I# J# n; q6 R
void MC_ProgramSpeedRampMotor1( int16_t hFinalSpeed, uint16_t hDurationms );# v3 M) w* d7 c" q8 V( F& a
这个函数的第二个参数你改过吗,第二个参数就是达到目标值的时间,越小加速度越快# P( `( U' k3 x1 [/ U
( }! w) F4 m9 r/ S
考虑另外一个问题,电机惯性较大,电机驱动板的驱动能力有限,也许最多就只能10+s才能达到目标转速
子曰好人 回答时间:2019-3-13 10:16:47
gatsby32 发表于 2019-3-13 09:42: P5 a- n- [( h  S
老哥  这个task是写在main函数里面吗  ?这个按键中断有什么作用啊?麻烦老哥给我解解惑,第一次学这些 很 ...
2 `. p6 o: l  Q' V8 U
1.在我的程序里按键的作用起的是传递信号的作用,按键中断中翻转LED11引脚,主函数通过读取LED11引脚电平值做是否启动任务的判断。
3 E7 {- k4 }/ n7 C: H2.在我的代码里启停是可控的,通过LED11引脚电平来判断是否执行task1。另外,task1的要求就是延时不断启停,我这样写是没有问题的
子曰好人 回答时间:2019-3-28 17:05:01
gatsby32 发表于 2019-3-28 16:52
( d* u" \  `# @老哥 这两个函数的内容不一样 ,为了完成实验一 我需要把这个内容改成和你一样的吗! J# S# H" N3 d  M  @9 r/ R
...

0 K. |# @) f$ ?9 K直接扔好几个问题,还没完全看过来' g) S* d# m: Z- |  |+ k, K9 J
回复20#和21#:
0 {0 D( a9 W; L! V6 L2 C' X3 PUser_label那个自己想写什么名字无所谓,根据自己喜好就OK3 Z& ?3 Q1 a% F/ C
回复22#和23#:
! K) l% j8 U; X2 `7 ^5 M不用跟我的代码完全一样,这个只是我用于控制实验进行与否的一种方式,你也可以通过其他方式来做
5 x9 y3 _) r" x; ~$ G) E
freeelectron 回答时间:2018-9-2 18:27:19
这个只显示了速度波形,其实要想显示更多东西,就在通讯协议里面加就好了,ST这个是串口的,板子和上位机通讯协议已经固定了,想要显示更多可以自己搞个上位机;: ]* V/ E1 Y/ X* D, `
子曰好人 回答时间:2018-9-2 19:05:16
freeelectron 发表于 2018-9-2 18:27
, L) W. w/ l( S这个只显示了速度波形,其实要想显示更多东西,就在通讯协议里面加就好了,ST这个是串口的,板子和上位机通 ...

, d0 j4 X$ N4 x5 t. c4 J& E好的,有时间我去了解一下通讯协议的代码,尝试显示其他变量。另外一个就是觉得plotter采样率有点低,Jscope采样率1kHz在好些时候都显得不太够用。
FF_胖子 回答时间:2018-9-14 09:20:41
这套板最大可以承受多大的电压,官方给的不是8-48V吗,但是我的刚到40V下面那个nucle板就烧了
  }/ X. r6 p7 I- K
子曰好人 回答时间:2018-9-14 09:29:48
ff321 发表于 2018-9-14 09:20
7 a- F+ {5 o/ F& F8 |6 M这套板最大可以承受多大的电压,官方给的不是8-48V吗,但是我的刚到40V下面那个nucle板就烧了+ \4 M! @, ?8 E1 x' e4 ]
...
8 l: j5 P- n7 [( s2 a( h3 @4 ~
我没试过其他电压,一直用的12V,你是不是正负极接反了
FF_胖子 回答时间:2018-9-14 09:47:12
子曰好人 发表于 2018-9-14 09:29  i( Y3 a4 a+ g
我没试过其他电压,一直用的12V,你是不是正负极接反了

) N: [& a9 N# X不是,我是从24V慢慢升上去的,
子曰好人 回答时间:2018-9-14 10:04:26
ff321 发表于 2018-9-14 09:47( A+ ~+ `7 X3 n2 j9 ^
不是,我是从24V慢慢升上去的,

3 h: l5 J4 s. w& T( y我后面尝试一下高电压再给你反馈吧,主要是现在我也没有高电压的电机,所以一直用的12V
FF_胖子 回答时间:2018-9-14 10:57:54
子曰好人 发表于 2018-9-14 10:04+ ?7 U4 b2 Z0 d6 }% H- f) l
我后面尝试一下高电压再给你反馈吧,主要是现在我也没有高电压的电机,所以一直用的12V ...
5 D0 G9 ]8 Q; m- e  c$ x
好的,还是小心点吧
子曰好人 回答时间:2018-9-14 18:52:52
ff321 发表于 2018-9-14 10:57
& H1 c8 [' y& Y- i6 C) o# }9 ^7 B好的,还是小心点吧
$ f7 U3 V# \; d9 k& k
上电40V驱动板坏了,底板还是好的,这个可能需要告知一下ST了
VernonBacon 回答时间:2018-9-19 09:21:24
freeelectron 发表于 2018-9-2 18:273 q! J* Y6 h# d/ H
这个只显示了速度波形,其实要想显示更多东西,就在通讯协议里面加就好了,ST这个是串口的,板子和上位机通 ...
+ J- m% a+ x: F
板子和上位机通讯协议是啥
子曰好人 回答时间:2018-9-19 09:37:38
vernonvb 发表于 2018-9-19 09:21/ p, m# D9 w7 T2 {# H$ R. ^
板子和上位机通讯协议是啥

0 @; v' Q5 M4 B+ M5 {6 h; x我还没看,你可以去串口中断函数中了解通信协议
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
9 a$ I1 z8 i2 B. Q# }5 ?. xMCT_Handle_t* 这个类型的指针,会报错,没有定义,然后我加上mc_tuning.h就可以了,楼主你有遇到吗? ...
7 F1 Q; x& g6 h+ h  h+ N
正常呀,这属于C语言基本功,MCT_Handle_t这个结构体在mc_tuning.h中定义的,你要在其他文件中使用当然要包含定义这个结构体的头文件嘛
mozartc 回答时间:2018-9-20 14:12:20
子曰好人 发表于 2018-9-20 14:08
: {# h% Y5 [* J. F0 N正常呀,这属于C语言基本功,MCT_Handle_t这个结构体在mc_tuning.h中定义的,你要在其他文件中使用当然要 ...
; \/ K& O. J7 [
那就好,我还以为是我工程建立的有问题
gatsby32 回答时间:2019-3-11 10:49:32
老哥  cubemax怎么初试化引脚啊,你能把你的任务一和任务二的工程发给我我吗,我不知道task这些函数要添加在哪里 ,我以前没学过这些东西 ,是个菜鸟 ,望老哥多多指教啊
12下一页

所属标签

相似分享

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版