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

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

[复制链接]
子曰好人 发布时间:2018-9-2 10:18
本帖最后由 子曰好人 于 2018-9-2 10:21 编辑
' e, a- |4 S& A' w0 H' u- ~( q& E- i
$ o) B5 M: W9 [
经过前期的准备,可以使用电机套件完成一些实验任务了。
首先是任务1和任务2的要求:
task1.png
task2.png
任务一和任务二基于workbench生成的代码来做并不难,因为代码里面提供了很多api函数并且做了很多软件上的保护,可以放心写代码,硬件不会那么容易损坏。
2 A1 ?9 m1 f2 D: L; z. D' Z
拿到一份陌生的代码除了了解我前面几篇帖子所说的内容外,在开始写代码前还需要了解api函数。我们可以打开mc_api.h看一看workbench都给我们提供了什么函数。
& Y/ s3 [, H- o4 h) X
  1. /** @addtogroup MCIAPI5 h& i" \  o1 }& j; R, J1 X
  2.   * @{
    / i: v  k& s( v
  3.   */
    " b7 U' {! g8 x! L* i# |( z0 O
  4. ; S$ }3 Z! A1 R0 k
  5. typedef enum {UDRC_STATE_IDLE, UDRC_STATE_REQUESTED, UDRC_STATE_EOC} UDRC_State_t;
    9 V6 U3 M( V' e8 f
  6. * Z+ ^! Z. L+ k% i1 f
  7. /* Starts Motor 1 */* W$ Y) H/ B0 @
  8. bool MC_StartMotor1(void);
    # P9 c6 }$ B% h" [$ j4 `7 W( G
  9. + Q- n1 g8 {4 p3 s# m* s
  10. /* Stops Motor 1 */
    3 `$ B: j2 o( T, C
  11. bool MC_StopMotor1(void);
    & e2 M5 E9 d( E

  12. 9 E2 }0 i2 \% Q4 q
  13. /* Programs a Speed ramp for Motor 1 */
    % ?! ^& H- q+ H+ g* }4 t
  14. void MC_ProgramSpeedRampMotor1( int16_t hFinalSpeed, uint16_t hDurationms );
    5 _1 Q9 Q! J, F$ B6 R5 j$ c. V6 g- s

  15. + T, f( o3 e" A! I$ j
  16. /* Programs a Torque ramp for Motor 1 */
    # }/ n: l+ n. J  b1 ~1 v
  17. void MC_ProgramTorqueRampMotor1( int16_t hFinalTorque, uint16_t hDurationms );
    * ~; h: h3 k2 `  d3 D2 |1 {$ o

  18. ' Q6 T7 C8 \3 T5 W
  19. /* Programs a current reference for Motor 1 */& e0 b0 e  s& G& X  ^* `
  20. void MC_SetCurrentReferenceMotor1( Curr_Components Iqdref );
    4 U6 l& ]! d$ B' u: M" C# O

  21. 2 \1 p( D8 C8 P6 Z  L
  22. /* Returns the state of the last submited command for Motor 1 */$ |0 ~* `2 z2 c) Z( _
  23. MCI_CommandState_t  MC_GetCommandStateMotor1( void);
    : G, ^" \4 J$ c+ h1 q3 q" j
  24. 0 W8 M  r, b: ~( U% s. l
  25. /* Stops the execution of the current speed ramp for Motor 1 if any */2 ?* r( _0 H. _: \
  26. bool MC_StopSpeedRampMotor1(void);5 W0 t+ K; k( P% F2 v# ^

  27. 3 w, S' f2 p7 m  r' G4 B8 k
  28. /* Returns true if the last submited ramp for Motor 1 has completed, false otherwise */6 i, l0 f. d+ ^9 Y
  29. bool MC_HasRampCompletedMotor1(void);
    & J; H  n, N% o* R
  30. & o2 W" t3 J& S! ~! b! l
  31. /* Returns the current mechanical rotor speed reference set for Motor 1, expressed in dHz (tenth of Hertz) */
    / N6 e# W  f& h- |
  32. int16_t MC_GetMecSpeedReferenceMotor1(void);' z$ B+ G, k4 j' @
  33. ; P! T* S; X5 n6 `
  34. /* Returns the last computed average mechanical rotor speed for Motor 1, expressed in dHz (tenth of Hertz) */; L+ W$ `# y/ |+ ]
  35. int16_t MC_GetMecSpeedAverageMotor1(void);
    4 z! @6 n6 `: R

  36. " f4 o% `% s8 G" x) J) H; @' S- @
  37. /* Returns the final speed of the last ramp programmed for Motor 1, if this ramp was a speed ramp */
    ! i# t7 X8 g. x9 f' J8 l# T
  38. int16_t MC_GetLastRampFinalSpeedMotor1(void);
    3 w3 r2 Q) l1 J2 m+ P+ x
  39. % U  g2 m( C: g! Z  e; t/ R
  40. /* Returns the current Control Mode for Motor 1 (either Speed or Torque) */
    - W# w$ Q) H% ^; ^! L6 w) |9 K: l. G
  41. STC_Modality_t MC_GetControlModeMotor1(void);
    : a* L* o1 z4 b+ A3 y

  42. : h8 x0 j' j4 _5 @8 X3 o
  43. /* Returns the direction imposed by the last command on Motor 1 */
      T& p" `) U6 P% l1 K
  44. int16_t MC_GetImposedDirectionMotor1(void);
    9 d1 j% Y: L1 D: Z  Y' b- G8 V0 \
  45.   Z) u3 u$ }8 ?% U
  46. /* Returns the current reliability of the speed sensor used for Motor 1 */' }* \$ }; ~- o- q
  47. bool MC_GetSpeedSensorReliabilityMotor1(void);8 W" u+ `2 {  {$ Y
  48. " p9 v5 N' x1 v- c. L: P+ \
  49. /* returns the amplitude of the phase current injected in Motor 1 */
    ( s; Z. _$ Y0 }
  50. int16_t MC_GetPhaseCurrentAmplitudeMotor1(void);9 z' P1 l2 `6 O1 s, i

  51. ( G9 d8 r+ X( A5 H# g( b
  52. /* returns the amplitude of the phase voltage applied to Motor 1 */
    0 j: G: g3 L& Y4 H6 f1 V
  53. int16_t MC_GetPhaseVoltageAmplitudeMotor1(void);
    # g' ?+ b3 e6 [9 [) X

  54. * v' v, g+ R! }  u
  55. /* returns current Ia and Ib values for Motor 1 */
    , B' j/ D; a+ }; ?: _
  56. Curr_Components MC_GetIabMotor1(void);
    2 F& O* x6 A8 T9 |1 k# Y
  57. + \2 F7 v6 v* D) C# D' i
  58. /* returns current Ialpha and Ibeta values for Motor 1 */' v  s# `! P! q# y# j
  59. Curr_Components MC_GetIalphabetaMotor1(void);) z+ c2 O& m# H4 m" k( V
  60. 2 q6 s. ^/ M7 m3 t* d
  61. /* returns current Iq and Id values for Motor 1 */
    8 Q& T0 U" N9 N) g3 E
  62. Curr_Components MC_GetIqdMotor1(void);; h& ^$ l. b* r: ?
  63. ; Q7 Y9 P5 ?! Z% m5 Z
  64. /* returns Iq and Id reference values for Motor 1 */5 J9 _( W  L$ }' d5 M6 n. U
  65. Curr_Components MC_GetIqdrefMotor1(void);  n3 d  T9 ^; m7 Y3 x  p7 [* g
  66. / q# d  r& B5 M/ @
  67. /* returns current Vq and Vd values for Motor 1 */( P: G# A, f3 c% D( O' y
  68. Volt_Components MC_GetVqdMotor1(void);5 b/ J$ F% v( l
  69. 5 ~* m% A* E& s- f6 P: `, K- ?  R0 i! `
  70. /* returns current Valpha and Vbeta values for Motor 1 */: W  L+ U# [! e. ~4 Z/ A
  71. Volt_Components MC_GetValphabetaMotor1(void);1 E% D% j6 I* N$ j1 m
  72. - X; b' Y& |* K0 c  U
  73. /* returns the electrical angle of the rotor of Motor 1, in DDP format */( p5 V. U' D: I* m; G
  74. int16_t MC_GetElAngledppMotor1(void);0 f4 X! t) H  @# @* ?- Q! f5 {

  75. ! }. F  M  ?* B$ |0 J
  76. /* returns the current electrical torque reference for Motor 1 */
    ! C" X3 B$ _- W& d1 Q% Q; p
  77. int16_t MC_GetTerefMotor1(void);
    : |% x, u* l' L( K# C

  78. / p! v% d! p9 f7 Z+ @( T
  79. /* Sets the reference value for Id */9 p4 S3 m! }6 q9 b
  80. void MC_SetIdrefMotor1( int16_t hNewIdref );
    ; B3 f2 F  L9 S5 p2 \
  81. ( n/ S& s% ^( E) l. _. a" S9 {
  82. /* re-initializes Iq and Id references to their default values */
    : f) B+ Y( W9 n3 ^# X
  83. void MC_Clear_IqdrefMotor1(void);7 D- F* q, x, M7 N+ z8 _

  84. 9 Z8 s. r! O! ~' W& ^' s! I
  85. /* Acknowledge a Motor Control fault on Motor 1 */
    , H( p: m+ }; A4 s  a  P; S
  86. bool MC_AcknowledgeFaultMotor1( void );
    + M( h0 p/ x% Y3 s! X' y' |- h

  87. 0 i4 J7 D3 c! O# a9 v; s* E
  88. /* Returns a bitfiled showing faults that occured since the State Machine of Motor 1 was moved to FAULT_NOW state */
    : k+ ?- y+ G% |6 i2 L
  89. uint16_t MC_GetOccurredFaultsMotor1(void);0 t" O- t1 u8 _. H3 U1 P
  90. $ V3 _+ x9 i3 C. \
  91. /* Returns a bitfield showing all current faults on Motor 1 */
    ( P/ q3 F; S% v6 {6 ]1 p; o- V
  92. uint16_t MC_GetCurrentFaultsMotor1(void);0 r. c/ `$ b& Z) n1 ?. V8 B( n

  93. 1 X. U1 m8 ?6 s( V5 d5 Q( L
  94. /* returns the current state of Motor 1 state machine */
    - _) ~5 |" ~0 h4 T1 p
  95. State_t  MC_GetSTMStateMotor1(void);
    # R  f7 _* u/ l/ ^) P) w" R. \

  96.   C" F* T' ?9 W. M) \) w7 f9 J! k
  97. /* programs a user defined ADC regular conversion */
    2 D# M6 ~& H* U/ {
  98. void MC_ProgramRegularConversion(uint8_t bChannel, uint8_t bSampleTime);
    7 S4 l5 ^& R0 u9 e
  99.   @" D( C% T: o
  100. /* Returns the value of the last executed user defined ADC regular conversion */  s0 X% F" j, p& N
  101. uint16_t MC_GetRegularConversionValue(void);
    " {5 k0 @. L, G/ p0 Z2 y3 |$ m
  102. 5 Z7 O) b) h2 U( I- ?* D* d% P5 F
  103. /* Returns the status of the last requested user defined ADC regular conversion */1 P  E/ X/ c1 ?
  104. UDRC_State_t MC_GetRegularConversionState(void);
复制代码
上面这些api函数是对单个电机的操作,包含了启动、调速、调转矩、以及电机各种状态的获取。
看了任务一的要求,个人认为电机控制还是需要与外部交互好一点,电机启停不可控对于大功率的电机控制来说比较危险。
任务一代码:
  1. void task_1(void)# r( n. Z" c9 X0 `3 t+ v" B9 f
  2. {
    6 n# U! W& k7 k* H' [5 a
  3.     MC_ProgramSpeedRampMotor1(3000/6,1000);
    % r  m& r! C% E- q; y4 s
  4.     MC_StartMotor1();
    - @5 L$ t4 M' a5 d- C
  5.     HAL_Delay(10000);
      [  V7 I( }& @. k* _8 ]* m4 L$ X0 T
  6.     MC_StopMotor1();
    - }' E# ]9 F6 `! U. y9 k  }
  7.     HAL_Delay(10000);
    ; w; d" C% r) n
  8. }
复制代码
主函数添加的代码:
  1. /* Infinite loop */
    4 `  G7 o8 x" j+ B+ E- a0 E
  2.   /* USER CODE BEGIN WHILE */3 p' c4 _! j6 X$ y
  3.   while (1). J* j' w, u" g$ q
  4.   {
    % o5 X& v' W% I
  5.       
    / S- x! @  S% o  Q* k
  6.       if(GPIO_PIN_SET == HAL_GPIO_ReadPin(LED11_GPIO_Port,LED11_Pin))
    # M4 Y+ V1 s; M; P+ _: w
  7.       {
    , y. K& L4 ]- U, i7 J! H
  8.               task_1();
    6 v. A3 i" h, r
  9.       }
    ! S" |5 W! G9 ?
  10.       else+ G) a+ e2 E* B
  11.       {
    9 c! W% }+ M# G9 k. D' u# R2 Z
  12.             MC_StopMotor1();# H) U7 M; u: |3 e) k4 f( o
  13.       }
    : o( r8 N7 H; z# K* B) a0 F- k
  14.       realspeed = MC_GetMecSpeedAverageMotor1()*6;
    0 k. q0 t) T5 K  [3 g. t$ y: n
  15.   /* USER CODE END WHILE */
复制代码
按键中断处理函数代码在ui_task.c这个文件中:
  1. void UI_HandleStartStopButton_cb (void)
    3 A8 _6 V; H5 S
  2. {9 g! T  {5 b9 a8 a" y6 b
  3. /* USER CODE BEGIN START_STOP_BTN */$ q4 b3 \" b* `; A* r+ ~
  4.   HAL_GPIO_TogglePin(LED11_GPIO_Port,LED11_Pin);
    8 S0 r. A; I. G/ S
  5. /* USER CODE END START_STOP_BTN */
    - g! _# `* ]; a7 ~$ u
  6. }; y# d! q! A9 H) Z: _! J8 y
复制代码
这样可以通过按键来控制任务的运行并且可以通过led的亮灭来观察系统所处的状态。LED11是驱动板上的一颗led,引脚号是PB2,可以通过cubemx来设置初始化代码。
通过monitor可以看到速度变化曲线图:
任务一速度变化截图.png
ok,任务一完成。
-------------------------------------------------------------' O  D( }$ j$ o4 G2 o8 T
任务二代码:
  1. void task_2(void), k) I1 p) a  s
  2. {! w! l8 R2 ^% T% C  f7 `
  3.         int16_t Speed_Kp,Speed_Ki;2 `/ e, c* T, O8 ~1 r2 P; f
  4.         MCT_Handle_t * pMctHdl;
    + y+ F8 W* g0 ]* a8 J& @: [
  5.         MC_ProgramSpeedRampMotor1(3000/6,1000);9 Y- o5 L" x! C5 T, h
  6.         MC_StartMotor1();- i" m  V3 [3 G! s% i" ^6 r4 y
  7.         HAL_Delay(3000);
    # ]! [$ j# a2 M. c, A8 k& Y
  8.         MC_StopMotor1();
    : \4 H" R1 |9 \! f
  9.         HAL_Delay(1000); & Q3 r1 A, `/ v$ b2 s: P8 L
  10.      pMctHdl = GetMCT(M1);
    ; `- T) Z: @  |9 e6 r7 \
  11.      Speed_Kp = PID_GetKP(pMctHdl->pPIDSpeed);
    0 U* ]" i" U; U* G- {1 }, \( N) o9 n
  12.      Speed_Ki = PID_GetKI(pMctHdl->pPIDSpeed);8 @+ W9 O: p) G, V- h9 W, y
  13.      PID_SetKP(pMctHdl->pPIDSpeed,Speed_Kp*2);
    ! i# q; ?5 o, G8 k
  14.      PID_SetKI(pMctHdl->pPIDSpeed,Speed_Ki*2);
    $ f6 u* m4 h/ x; J2 k
  15.      MC_ProgramSpeedRampMotor1(3000/6,1000);
    ) @/ q* {+ L7 ~6 d, Q' d3 F
  16.      MC_StartMotor1();8 ]0 `2 C8 B  K. d3 X0 ]
  17.      HAL_Delay(3000);* A. ]  I- h- l
  18.      MC_StopMotor1();
    / Y$ ?- {; m3 n
  19.      HAL_Delay(1000);
      p2 `9 e6 U/ Y' @9 l& g7 J! p* s  w
  20.      PID_SetKP(pMctHdl->pPIDSpeed,Speed_Kp/2);/ g9 [" y+ ~( L9 P
  21.      PID_SetKI(pMctHdl->pPIDSpeed,Speed_Ki/2);
    9 s+ q+ Y% O/ a5 d" O9 T8 o0 y
  22.      MC_ProgramSpeedRampMotor1(3000/6,1000);
    - m4 Q# L* G7 E7 f, p
  23.      MC_StartMotor1();
    & d2 @% _" z" C+ P
  24.      HAL_Delay(3000);
    # }3 p! U. q; B; I! N5 m. t% `3 L2 f
  25.      MC_StopMotor1();   ) [2 i$ n$ h/ s! [+ a' n. G. `  u
  26.         HAL_GPIO_WritePin(LED11_GPIO_Port,LED11_Pin,GPIO_PIN_RESET);
    4 l" Q$ X" R* [. u+ p' g1 I) c
  27. }
复制代码
主函数代码和任务一相同,只是把task_1()改成task_2()就行了。最后一行把LED引脚拉低是为了让代码只运行一次,多次运行可以通过按键进行操作。
任务2速度截图.png
可以看到和预期结果是一致的,原始PI调节速度快,有超调现象;Kp、Ki同时增大一倍的时候,调节加快了,并且超调现象被抑制了;当Kp、Ki同时缩小一倍时可以看到虽然调节很快,但是有严重的超调现象。
9 Q# q) ~9 R/ m

1 K* T# ^1 m1 A+ K5 s. \
通过monitor的图形显示速度波形极大的方便调试PID的过程,ST考虑得真周到。
+ V: q5 C* _# l+ n, E5 \  {- D
我在这里有个疑问,这个plotter只能显示参考速度的波形吗,还能不能添加其他变量来查看系统某个变量的变化趋势呢。之前我一直是用的Jscope,但是Jscope需要连接Jlink来查看,对于这款套件来说需要额外连接Jlink调试器,有一点点麻烦。后面调试有必要我还是会使用Jscope来查看一些变量的波形,并且分享到论坛。 3 t& m" a" B" \1 t( f9 C

9 G# v7 Y( [$ l: {6 _+ I2 Y
任务一和任务二已完成,欢迎大家留言讨论。5 a/ d, C7 [' {7 p% h6 Z
1 |5 B3 ~/ B. j  I7 {
: n9 J+ V9 @' ~; v8 r
) e% p& [5 ]: T/ G7 j
" a# L% }  b. J! W- c; c
收藏 2 评论27 发布时间:2018-9-2 10:18

举报

27个回答
子曰好人 回答时间:2019-7-23 09:13:07
jeff1996 发表于 2019-7-22 16:34: m2 n, f! n6 n6 e) r! U
楼主。 我按照你任务1的程序。 但是我的电机加速到3000RPM需要10多秒。 怎么设置都是10多秒,很奇怪。 请问 ...
7 O- {: Z* k! T! d% W
/* Programs a Speed ramp for Motor 1 *// p: |, \4 c1 K% h, ^  U$ a6 w
void MC_ProgramSpeedRampMotor1( int16_t hFinalSpeed, uint16_t hDurationms );( E" @& _7 Q5 @) n/ M
这个函数的第二个参数你改过吗,第二个参数就是达到目标值的时间,越小加速度越快; P' }; q4 Y0 W/ b0 Y: u4 z
7 x0 c8 Q; a7 g! `
考虑另外一个问题,电机惯性较大,电机驱动板的驱动能力有限,也许最多就只能10+s才能达到目标转速
子曰好人 回答时间:2019-3-13 10:16:47
gatsby32 发表于 2019-3-13 09:42' L' c$ @5 m9 `- y2 U/ O
老哥  这个task是写在main函数里面吗  ?这个按键中断有什么作用啊?麻烦老哥给我解解惑,第一次学这些 很 ...
2 ^6 X0 |  O8 Q7 |3 f" ]
1.在我的程序里按键的作用起的是传递信号的作用,按键中断中翻转LED11引脚,主函数通过读取LED11引脚电平值做是否启动任务的判断。" }( ^+ J! d. I0 M- o: l: m& l
2.在我的代码里启停是可控的,通过LED11引脚电平来判断是否执行task1。另外,task1的要求就是延时不断启停,我这样写是没有问题的
子曰好人 回答时间:2019-3-28 17:05:01
gatsby32 发表于 2019-3-28 16:52
8 w7 |  [" f0 C  u5 P* G老哥 这两个函数的内容不一样 ,为了完成实验一 我需要把这个内容改成和你一样的吗" y* T( E+ k' O. d" A: K- c- `
...
: P1 W9 z2 z) {  J3 H
直接扔好几个问题,还没完全看过来
7 R) B  t. I9 r回复20#和21#:
4 K" K: R3 e1 O3 `) B3 J2 zUser_label那个自己想写什么名字无所谓,根据自己喜好就OK6 k+ V3 w5 n7 J5 X+ U
回复22#和23#:
0 g' g6 i5 F& Y# v) B" F7 H不用跟我的代码完全一样,这个只是我用于控制实验进行与否的一种方式,你也可以通过其他方式来做
& F# j, m# l# N. o
freeelectron 回答时间:2018-9-2 18:27:19
这个只显示了速度波形,其实要想显示更多东西,就在通讯协议里面加就好了,ST这个是串口的,板子和上位机通讯协议已经固定了,想要显示更多可以自己搞个上位机;
1 o& q0 |  S$ t7 I5 f
子曰好人 回答时间:2018-9-2 19:05:16
freeelectron 发表于 2018-9-2 18:27
+ b+ L% R1 X, d- G- R# N这个只显示了速度波形,其实要想显示更多东西,就在通讯协议里面加就好了,ST这个是串口的,板子和上位机通 ...

9 w3 X5 y3 f$ M8 x; \1 w好的,有时间我去了解一下通讯协议的代码,尝试显示其他变量。另外一个就是觉得plotter采样率有点低,Jscope采样率1kHz在好些时候都显得不太够用。
FF_胖子 回答时间:2018-9-14 09:20:41
这套板最大可以承受多大的电压,官方给的不是8-48V吗,但是我的刚到40V下面那个nucle板就烧了6 ]; ~3 G. @9 [2 Y' Y
子曰好人 回答时间:2018-9-14 09:29:48
ff321 发表于 2018-9-14 09:20
6 [6 T" K( `, m, L! l# ~这套板最大可以承受多大的电压,官方给的不是8-48V吗,但是我的刚到40V下面那个nucle板就烧了
3 ]: c9 l: r$ U1 O3 \- b ...
% i* p( T! e2 [7 Y. c0 `) g
我没试过其他电压,一直用的12V,你是不是正负极接反了
FF_胖子 回答时间:2018-9-14 09:47:12
子曰好人 发表于 2018-9-14 09:297 ]3 i8 X9 U& J0 H2 P; q" p
我没试过其他电压,一直用的12V,你是不是正负极接反了
, W7 S" T7 T+ o' X
不是,我是从24V慢慢升上去的,
子曰好人 回答时间:2018-9-14 10:04:26
ff321 发表于 2018-9-14 09:472 D7 Q- e4 @8 n' g
不是,我是从24V慢慢升上去的,
+ q$ T" D: d! x6 ^' ]
我后面尝试一下高电压再给你反馈吧,主要是现在我也没有高电压的电机,所以一直用的12V
FF_胖子 回答时间:2018-9-14 10:57:54
子曰好人 发表于 2018-9-14 10:04+ B9 F0 X, X+ s; O4 ?+ F
我后面尝试一下高电压再给你反馈吧,主要是现在我也没有高电压的电机,所以一直用的12V ...

/ H) ^  X6 _  U+ n9 |# u好的,还是小心点吧
子曰好人 回答时间:2018-9-14 18:52:52
ff321 发表于 2018-9-14 10:579 w: Z* R, Y' I- |+ J- }
好的,还是小心点吧

, @+ @  Y6 x7 y上电40V驱动板坏了,底板还是好的,这个可能需要告知一下ST了
VernonBacon 回答时间:2018-9-19 09:21:24
freeelectron 发表于 2018-9-2 18:27! X% @3 H- ?$ L4 I8 P! B0 H
这个只显示了速度波形,其实要想显示更多东西,就在通讯协议里面加就好了,ST这个是串口的,板子和上位机通 ...
7 T; S8 G  ?7 P4 Q
板子和上位机通讯协议是啥
子曰好人 回答时间:2018-9-19 09:37:38
vernonvb 发表于 2018-9-19 09:21
2 B! `2 g. a/ x4 Z板子和上位机通讯协议是啥

1 N3 W  E/ J' |2 ~  n8 C) q: j我还没看,你可以去串口中断函数中了解通信协议
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
" p7 I( M1 }& [, m0 h" fMCT_Handle_t* 这个类型的指针,会报错,没有定义,然后我加上mc_tuning.h就可以了,楼主你有遇到吗? ...
: x& r7 K1 ?8 E2 \  m% i! D: ?4 S# z2 u) k
正常呀,这属于C语言基本功,MCT_Handle_t这个结构体在mc_tuning.h中定义的,你要在其他文件中使用当然要包含定义这个结构体的头文件嘛
mozartc 回答时间:2018-9-20 14:12:20
子曰好人 发表于 2018-9-20 14:08$ p: o, F( m. U% z" p
正常呀,这属于C语言基本功,MCT_Handle_t这个结构体在mc_tuning.h中定义的,你要在其他文件中使用当然要 ...
1 t- ~8 z1 T; Y& k
那就好,我还以为是我工程建立的有问题
gatsby32 回答时间:2019-3-11 10:49:32
老哥  cubemax怎么初试化引脚啊,你能把你的任务一和任务二的工程发给我我吗,我不知道task这些函数要添加在哪里 ,我以前没学过这些东西 ,是个菜鸟 ,望老哥多多指教啊
12下一页

所属标签

相似分享

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