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

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

[复制链接]
子曰好人 发布时间:2018-9-2 10:18
本帖最后由 子曰好人 于 2018-9-2 10:21 编辑
9 \3 R1 k2 C% B; B& X( o2 @& F1 ], h  j( I" H3 O& ]" C
经过前期的准备,可以使用电机套件完成一些实验任务了。
首先是任务1和任务2的要求:
task1.png
task2.png
任务一和任务二基于workbench生成的代码来做并不难,因为代码里面提供了很多api函数并且做了很多软件上的保护,可以放心写代码,硬件不会那么容易损坏。

0 [! f& S/ g: Z6 s8 Z4 t3 ~( Z+ q
拿到一份陌生的代码除了了解我前面几篇帖子所说的内容外,在开始写代码前还需要了解api函数。我们可以打开mc_api.h看一看workbench都给我们提供了什么函数。
! n# w( |% [2 C- ]; {5 Z
  1. /** @addtogroup MCIAPI0 |. f: J" U# i& q$ O  r  Y1 Q
  2.   * @{- P# n+ T( C& p* I
  3.   */, d! [' [7 e8 P5 ]. F+ q3 R* `$ B

  4. / c5 g- r1 v, C4 k- E" A+ m
  5. typedef enum {UDRC_STATE_IDLE, UDRC_STATE_REQUESTED, UDRC_STATE_EOC} UDRC_State_t;
    ! L5 q: t9 w2 ^- i

  6. 8 R& S4 f6 M* Q* D7 P
  7. /* Starts Motor 1 */  N5 b- `, F+ K/ E
  8. bool MC_StartMotor1(void);
    * R- \; f. b5 K: G9 |

  9. ( m6 D0 B! n5 c2 I) I' x
  10. /* Stops Motor 1 */
    & c& y% G# \5 e4 \2 z, l0 h
  11. bool MC_StopMotor1(void);
    1 r9 A* g6 X# K& I$ W! t5 V  g

  12. ' ~' e$ L- q. [+ A6 N) M! f6 v2 s
  13. /* Programs a Speed ramp for Motor 1 */. Q' b2 X! E) g6 n
  14. void MC_ProgramSpeedRampMotor1( int16_t hFinalSpeed, uint16_t hDurationms );
    % }/ }+ h  O" G& h0 J' u. W

  15. % D, P$ P4 q! _# g0 x5 A
  16. /* Programs a Torque ramp for Motor 1 */
    4 u. a  y6 }- ^- i$ N$ v5 r
  17. void MC_ProgramTorqueRampMotor1( int16_t hFinalTorque, uint16_t hDurationms );
    9 S6 f' ], O$ x) T3 U& s9 D
  18. : \2 ^3 e1 u6 t# E8 b3 \
  19. /* Programs a current reference for Motor 1 */
    : J! T7 b( ?% M# h- r0 E+ n
  20. void MC_SetCurrentReferenceMotor1( Curr_Components Iqdref );
    / @* N' \7 |9 [. A) i& K9 h, g
  21. 4 D/ W( {6 T- I8 h' a" ~# |
  22. /* Returns the state of the last submited command for Motor 1 */
    % _; w2 G7 f$ L$ W
  23. MCI_CommandState_t  MC_GetCommandStateMotor1( void);
    ; S) O, q* r) p5 ]4 c0 D# f' k

  24. - }( o4 i9 G, ~
  25. /* Stops the execution of the current speed ramp for Motor 1 if any */
    . e7 Z; Z, g1 @
  26. bool MC_StopSpeedRampMotor1(void);
    $ b  H8 i! V! q$ o1 k' i9 T

  27. * a$ T0 I. ~* Q: X3 ^8 {
  28. /* Returns true if the last submited ramp for Motor 1 has completed, false otherwise */
    1 B- Q' ?7 A3 q3 n, U- `9 _3 ^
  29. bool MC_HasRampCompletedMotor1(void);6 R- N& G' W* c, @

  30. * V( h# Q! Q3 p& P1 L
  31. /* Returns the current mechanical rotor speed reference set for Motor 1, expressed in dHz (tenth of Hertz) */
    7 E" j% ^) V. F' O
  32. int16_t MC_GetMecSpeedReferenceMotor1(void);
    - w1 r# |; g. f' r- F9 ^6 G

  33. ) b4 P+ x! Z' t! |. U
  34. /* Returns the last computed average mechanical rotor speed for Motor 1, expressed in dHz (tenth of Hertz) */
    6 A; ]6 ^7 R$ v4 A! A
  35. int16_t MC_GetMecSpeedAverageMotor1(void);
    6 }% y) [5 G: d
  36. " l% a! r+ s  j+ Y" O' o
  37. /* Returns the final speed of the last ramp programmed for Motor 1, if this ramp was a speed ramp */* C# Q% j& e( Z" ^2 T: j, @
  38. int16_t MC_GetLastRampFinalSpeedMotor1(void);
    + g: ]( R5 d+ G% B7 i0 N- p

  39. ( q" t9 S+ v4 U2 F. S
  40. /* Returns the current Control Mode for Motor 1 (either Speed or Torque) */
    , i, ^# A! {1 Z+ r: ^" H" r
  41. STC_Modality_t MC_GetControlModeMotor1(void);
    4 c/ O8 U+ T. W2 ~4 z6 G: V! K+ D

  42. % L0 o0 o, @/ {9 I& V, d' r
  43. /* Returns the direction imposed by the last command on Motor 1 */
    ) s! p% Q% f& k7 y
  44. int16_t MC_GetImposedDirectionMotor1(void);
    ' v1 e+ n) N; T% J/ m# ?8 P

  45. 7 u& i; n! k9 \( v4 ~" f2 f9 u
  46. /* Returns the current reliability of the speed sensor used for Motor 1 */! d. d8 ?. i1 ^4 H. R% L7 J8 _# L
  47. bool MC_GetSpeedSensorReliabilityMotor1(void);
    - B; y. @* N2 A) [
  48. * N/ A- d- x3 D. p% ?- Y1 Y9 e
  49. /* returns the amplitude of the phase current injected in Motor 1 */
    % r: V1 W( p5 }& Y( v$ G( c
  50. int16_t MC_GetPhaseCurrentAmplitudeMotor1(void);/ _: o/ q; }& G/ U  y. I

  51. ; a. v* U0 L' G( \
  52. /* returns the amplitude of the phase voltage applied to Motor 1 */8 [/ I4 V4 p- d( I
  53. int16_t MC_GetPhaseVoltageAmplitudeMotor1(void);. c1 z5 u: C! s$ L; i( p+ k4 D
  54. 1 X4 Z! N( d& k/ B# O7 L' [! s% M
  55. /* returns current Ia and Ib values for Motor 1 */7 I1 ]+ C% A4 z# k/ |
  56. Curr_Components MC_GetIabMotor1(void);/ l  {1 c+ D! Q) ^/ u

  57. 2 k- H. o! W4 u# M( e  C
  58. /* returns current Ialpha and Ibeta values for Motor 1 */
    * }4 O8 A$ v# c
  59. Curr_Components MC_GetIalphabetaMotor1(void);
    # `9 L' T% s3 U" k9 S+ b
  60. - s, N6 K. v3 L( s, E
  61. /* returns current Iq and Id values for Motor 1 */
    3 w0 {) N" i! w2 ^+ F! S
  62. Curr_Components MC_GetIqdMotor1(void);
    6 U0 e; L8 A: k# I9 G

  63. / [, A, A" F6 u; |: W  J
  64. /* returns Iq and Id reference values for Motor 1 */
    & v/ g6 j! L) [+ X7 a  H/ u
  65. Curr_Components MC_GetIqdrefMotor1(void);. k, ~0 j" ^$ L

  66. " i6 `) C7 g: S' C& |
  67. /* returns current Vq and Vd values for Motor 1 */
    1 R0 h* \! t* y7 O, d5 ^  R1 Q# f
  68. Volt_Components MC_GetVqdMotor1(void);
    ! @; ^9 }" ^# e$ W7 i
  69. ! k5 ?- u4 ~  f  p. c( {
  70. /* returns current Valpha and Vbeta values for Motor 1 */
    4 W3 L8 z* f5 [
  71. Volt_Components MC_GetValphabetaMotor1(void);5 a3 O# A  P' A, A( y

  72. ! m5 j" m* J* d  l: S( D9 ^8 l
  73. /* returns the electrical angle of the rotor of Motor 1, in DDP format */- w; `( G# O  j* @# F, p4 V7 K
  74. int16_t MC_GetElAngledppMotor1(void);3 J: `4 u/ L& f
  75. ( p# I' o) L* W) |5 l: M
  76. /* returns the current electrical torque reference for Motor 1 */9 W5 A- l% j) e3 o2 c2 G$ m
  77. int16_t MC_GetTerefMotor1(void);0 A5 g! {# g5 [+ ?3 C
  78. , V6 D4 [2 c5 }
  79. /* Sets the reference value for Id */
    * [3 n: I+ D9 W; Z+ L! }4 z
  80. void MC_SetIdrefMotor1( int16_t hNewIdref );- i' Q' J$ A  h: E- @% ?" \" t

  81. 2 C, {  i' f1 `8 e2 J+ Q3 c
  82. /* re-initializes Iq and Id references to their default values */
    . T" t/ J5 H$ o# M  \7 o
  83. void MC_Clear_IqdrefMotor1(void);" `1 x2 h0 r+ z# X" F/ `) v) A
  84. $ u+ t. d4 h* z! I) r3 D: _- ~, [/ A+ m
  85. /* Acknowledge a Motor Control fault on Motor 1 */. x% w5 l0 Y- ?( H
  86. bool MC_AcknowledgeFaultMotor1( void );% @% J. F1 a( x- ]8 o8 y0 ~
  87. * K/ A' F' |, X0 O9 o
  88. /* Returns a bitfiled showing faults that occured since the State Machine of Motor 1 was moved to FAULT_NOW state */: V0 I: b1 ~2 P" G
  89. uint16_t MC_GetOccurredFaultsMotor1(void);% @# d9 \5 U7 C8 W3 M6 u/ n- i+ p. e

  90. : g, E2 F% W- z" a2 v6 p/ W
  91. /* Returns a bitfield showing all current faults on Motor 1 */* [/ G- S; J' N# m) c8 y4 o
  92. uint16_t MC_GetCurrentFaultsMotor1(void);/ W. z9 r: l! G. t0 l, L

  93. 8 n% t1 @# a6 M' }
  94. /* returns the current state of Motor 1 state machine *// A1 [) Z' b; P% L
  95. State_t  MC_GetSTMStateMotor1(void);
    & @; C$ {5 t2 D# F, c" x3 k

  96. : A( b( w6 ^* d/ n( `" ~: p
  97. /* programs a user defined ADC regular conversion */# h/ \. d% m: c- s+ ~7 M6 n/ D% N
  98. void MC_ProgramRegularConversion(uint8_t bChannel, uint8_t bSampleTime);. `" g5 P! ~% c* @7 U2 Y% e( b

  99. & e9 c0 S8 `$ v. h0 g5 c; H4 F  T
  100. /* Returns the value of the last executed user defined ADC regular conversion */& z0 n, V# @' P: p2 ~* F# h9 h
  101. uint16_t MC_GetRegularConversionValue(void);' l6 m/ d5 ~& m* U
  102. : j: E4 _/ r& D) }: E: Y
  103. /* Returns the status of the last requested user defined ADC regular conversion */+ ?) {3 C  y: Z* D; z2 f% r
  104. UDRC_State_t MC_GetRegularConversionState(void);
复制代码
上面这些api函数是对单个电机的操作,包含了启动、调速、调转矩、以及电机各种状态的获取。
看了任务一的要求,个人认为电机控制还是需要与外部交互好一点,电机启停不可控对于大功率的电机控制来说比较危险。
任务一代码:
  1. void task_1(void)/ j5 L7 U! x4 R  W$ z: {( x+ F9 ]
  2. {
    8 i0 I& G) h8 }' e. r. z6 ~4 i
  3.     MC_ProgramSpeedRampMotor1(3000/6,1000);! Z6 b8 |* ]$ @/ D" G! s
  4.     MC_StartMotor1();. Y5 B$ v8 E4 a+ `& f$ Y
  5.     HAL_Delay(10000);/ M% [  o$ R6 U" \* T; s* O; ~, [
  6.     MC_StopMotor1();7 W4 j0 v( T5 M( y
  7.     HAL_Delay(10000);0 l7 f8 r5 q9 I* ?2 d( T+ m
  8. }
复制代码
主函数添加的代码:
  1. /* Infinite loop */
    1 G- U! A1 w* X$ k3 `4 f
  2.   /* USER CODE BEGIN WHILE */
    ' t9 ^4 F" |8 H2 N7 _4 _
  3.   while (1)
    5 ]- a2 Q0 n3 g1 _: R
  4.   {
    6 _3 Q  `1 Q# C2 L; Y( U
  5.       ! T; K4 h9 t% {4 }+ ^2 n
  6.       if(GPIO_PIN_SET == HAL_GPIO_ReadPin(LED11_GPIO_Port,LED11_Pin))
    7 Y' H3 d% }2 ^7 k: y, }# s
  7.       {
    # l/ k8 h5 C& f( a# r- T, A
  8.               task_1();- F0 ?0 F8 x4 [# @
  9.       }+ u, k$ h* {- \* j% \: d5 }% g& V
  10.       else
    & x3 k1 d  ?" f
  11.       {
    / \/ Z, P, [; J! Y* G
  12.             MC_StopMotor1();# w) z7 |- X4 U8 {
  13.       }
    & F2 U* \$ G6 r# Y5 w: H# Q+ S
  14.       realspeed = MC_GetMecSpeedAverageMotor1()*6;
    - G+ E* f$ x' S' ~5 H, }- O; i
  15.   /* USER CODE END WHILE */
复制代码
按键中断处理函数代码在ui_task.c这个文件中:
  1. void UI_HandleStartStopButton_cb (void)
    7 w# c, ~* X6 [0 R4 f7 v; y
  2. {, g8 A: K( g3 N! C
  3. /* USER CODE BEGIN START_STOP_BTN */' N8 E  P) }% H+ D. ~2 |
  4.   HAL_GPIO_TogglePin(LED11_GPIO_Port,LED11_Pin);2 o( {4 Y2 k) K
  5. /* USER CODE END START_STOP_BTN */9 ^% c0 ]% O3 P) q9 \
  6. }
    % W0 M8 I8 v  \  h+ z+ e. q
复制代码
这样可以通过按键来控制任务的运行并且可以通过led的亮灭来观察系统所处的状态。LED11是驱动板上的一颗led,引脚号是PB2,可以通过cubemx来设置初始化代码。
通过monitor可以看到速度变化曲线图:
任务一速度变化截图.png
ok,任务一完成。
-------------------------------------------------------------
( X; Q; ~+ S) R0 K; \8 [3 q" u
任务二代码:
  1. void task_2(void)
    5 |% x2 Z% D% [, P% c' C* Y3 D+ B  o
  2. {
    ) Z  ~. N" v7 v% ]$ V3 @$ e
  3.         int16_t Speed_Kp,Speed_Ki;
    + G4 W3 O0 P# C) c
  4.         MCT_Handle_t * pMctHdl;
    : ^( U" Y4 G7 N! {
  5.         MC_ProgramSpeedRampMotor1(3000/6,1000);8 k- x7 N0 |- g" H5 v- H, Q1 @) H( H
  6.         MC_StartMotor1();9 i" o3 P- X+ ]! h1 O; P
  7.         HAL_Delay(3000);
    & G& i2 n% z4 T7 C% D& p6 Q
  8.         MC_StopMotor1();
    3 _& f( f7 n& A# o/ V4 U
  9.         HAL_Delay(1000); : H0 N9 {1 w5 R' n: H: k! E5 c
  10.      pMctHdl = GetMCT(M1);, J9 F6 z) Z$ K, I: K$ t( f! Q
  11.      Speed_Kp = PID_GetKP(pMctHdl->pPIDSpeed);
    9 Y3 Q/ c$ }( A" X* b$ Z! E" O0 s
  12.      Speed_Ki = PID_GetKI(pMctHdl->pPIDSpeed);
    * D" i, f3 X( |/ v6 z
  13.      PID_SetKP(pMctHdl->pPIDSpeed,Speed_Kp*2);, F+ v! O7 R8 F3 V& ~
  14.      PID_SetKI(pMctHdl->pPIDSpeed,Speed_Ki*2);
    9 [4 ~! E' Y; w  b* J* A; [
  15.      MC_ProgramSpeedRampMotor1(3000/6,1000);
    7 p" s* H, F- h; D+ ^  B' g3 p' |6 U- u
  16.      MC_StartMotor1();) O6 O) c) O, @9 W7 m- ?
  17.      HAL_Delay(3000);
    1 p' z' B+ p( s+ \, L
  18.      MC_StopMotor1();
    3 v9 I% H' ~2 r( b+ t8 Y5 y9 @# D
  19.      HAL_Delay(1000);: u. V3 G$ Z4 ]+ e2 v
  20.      PID_SetKP(pMctHdl->pPIDSpeed,Speed_Kp/2);1 y) ^$ {; `9 K' t! J/ g% s2 [
  21.      PID_SetKI(pMctHdl->pPIDSpeed,Speed_Ki/2);6 R  s" e/ g4 P5 d0 g
  22.      MC_ProgramSpeedRampMotor1(3000/6,1000);
    ( I; u8 c2 j3 ^9 _: T! F
  23.      MC_StartMotor1();
    4 F9 H( c1 l+ W3 _3 ~# m, d. \
  24.      HAL_Delay(3000);
    4 E, S. V% Q7 H/ S% }" i, O
  25.      MC_StopMotor1();   
    # U" l  ]6 L% f
  26.         HAL_GPIO_WritePin(LED11_GPIO_Port,LED11_Pin,GPIO_PIN_RESET);
    , g* w8 ^" @. m8 C" L7 z3 |
  27. }
复制代码
主函数代码和任务一相同,只是把task_1()改成task_2()就行了。最后一行把LED引脚拉低是为了让代码只运行一次,多次运行可以通过按键进行操作。
任务2速度截图.png
可以看到和预期结果是一致的,原始PI调节速度快,有超调现象;Kp、Ki同时增大一倍的时候,调节加快了,并且超调现象被抑制了;当Kp、Ki同时缩小一倍时可以看到虽然调节很快,但是有严重的超调现象。 ) O9 ]; ]$ f0 C/ F+ J/ r7 J0 T- \6 J
0 G5 K! ]& B, Q3 W3 U" l/ J& a
通过monitor的图形显示速度波形极大的方便调试PID的过程,ST考虑得真周到。

/ I3 c3 q  Q, m: B% n) Q
我在这里有个疑问,这个plotter只能显示参考速度的波形吗,还能不能添加其他变量来查看系统某个变量的变化趋势呢。之前我一直是用的Jscope,但是Jscope需要连接Jlink来查看,对于这款套件来说需要额外连接Jlink调试器,有一点点麻烦。后面调试有必要我还是会使用Jscope来查看一些变量的波形,并且分享到论坛。 6 h. ~- c. e8 |+ T" N

7 [3 X! p& ]" b  K
任务一和任务二已完成,欢迎大家留言讨论。
! b+ f2 k% w" L( H3 P+ ~3 K. M1 e
. D# f: [* g2 g7 `% M9 g' u, C/ V

& y1 c* o9 l1 q" y
0 d: h& f( X$ |" l3 e
- v7 n- v5 C+ Y/ B9 l% [* ]
赞 收藏 2 评论27 发布时间:2018-9-2 10:18

举报

27个回答
子曰好人 回答时间:2019-7-23 09:13:07
jeff1996 发表于 2019-7-22 16:345 O4 h, o4 X) ^0 J. d
楼主。 我按照你任务1的程序。 但是我的电机加速到3000RPM需要10多秒。 怎么设置都是10多秒,很奇怪。 请问 ...

; h5 L% h; S) r( r* X/* Programs a Speed ramp for Motor 1 */; T- x+ L2 n  M5 W& T" n5 U0 ?
void MC_ProgramSpeedRampMotor1( int16_t hFinalSpeed, uint16_t hDurationms );
0 Q  O/ Y: r8 ?. G' p这个函数的第二个参数你改过吗,第二个参数就是达到目标值的时间,越小加速度越快  n5 T: G% O+ E/ W' y; m/ Z

& J4 u/ M) Q6 U考虑另外一个问题,电机惯性较大,电机驱动板的驱动能力有限,也许最多就只能10+s才能达到目标转速
子曰好人 回答时间:2019-3-13 10:16:47
gatsby32 发表于 2019-3-13 09:42
0 T$ W: Q5 Y0 s( \" _: ~0 X/ r老哥  这个task是写在main函数里面吗  ?这个按键中断有什么作用啊?麻烦老哥给我解解惑,第一次学这些 很 ...
! w5 p( a' n/ }6 c$ v
1.在我的程序里按键的作用起的是传递信号的作用,按键中断中翻转LED11引脚,主函数通过读取LED11引脚电平值做是否启动任务的判断。7 O  C. S2 c; I
2.在我的代码里启停是可控的,通过LED11引脚电平来判断是否执行task1。另外,task1的要求就是延时不断启停,我这样写是没有问题的
子曰好人 回答时间:2019-3-28 17:05:01
gatsby32 发表于 2019-3-28 16:521 F3 r( O% o7 ]3 f# ]% g
老哥 这两个函数的内容不一样 ,为了完成实验一 我需要把这个内容改成和你一样的吗
" q. m# g8 x5 }' a" E! m8 f; r+ ? ...

" D+ f# f, ]% W* m  X# L直接扔好几个问题,还没完全看过来7 b3 I8 N6 I, O5 ]% v) X+ o
回复20#和21#:
6 F) W  o) }/ |) B$ [% S5 V+ DUser_label那个自己想写什么名字无所谓,根据自己喜好就OK
/ A" s) i% O0 K$ v( a2 C- f6 S4 f回复22#和23#:& @' W+ @- `7 c* u
不用跟我的代码完全一样,这个只是我用于控制实验进行与否的一种方式,你也可以通过其他方式来做
$ m9 S2 j; Y) d. y( W  v) S
freeelectron 回答时间:2018-9-2 18:27:19
这个只显示了速度波形,其实要想显示更多东西,就在通讯协议里面加就好了,ST这个是串口的,板子和上位机通讯协议已经固定了,想要显示更多可以自己搞个上位机;* E9 K$ Z8 |( o! H' E9 w' f% ~$ j
子曰好人 回答时间:2018-9-2 19:05:16
freeelectron 发表于 2018-9-2 18:27
# }9 h5 n8 K* |1 n- S2 C这个只显示了速度波形,其实要想显示更多东西,就在通讯协议里面加就好了,ST这个是串口的,板子和上位机通 ...

: f* O8 X9 Q* E& a9 e% [好的,有时间我去了解一下通讯协议的代码,尝试显示其他变量。另外一个就是觉得plotter采样率有点低,Jscope采样率1kHz在好些时候都显得不太够用。
FF_胖子 回答时间:2018-9-14 09:20:41
这套板最大可以承受多大的电压,官方给的不是8-48V吗,但是我的刚到40V下面那个nucle板就烧了
2 l5 V7 B5 I  c
子曰好人 回答时间:2018-9-14 09:29:48
ff321 发表于 2018-9-14 09:200 i% ?  J+ T4 v
这套板最大可以承受多大的电压,官方给的不是8-48V吗,但是我的刚到40V下面那个nucle板就烧了
: [2 [& T: Z7 w) f  b+ O) P# ^ ...

* O! m$ C7 p2 [: J/ h) h' N我没试过其他电压,一直用的12V,你是不是正负极接反了
FF_胖子 回答时间:2018-9-14 09:47:12
子曰好人 发表于 2018-9-14 09:296 I& p# N/ T! n1 H2 e  W
我没试过其他电压,一直用的12V,你是不是正负极接反了
$ b9 E3 ]" y) K! w2 L
不是,我是从24V慢慢升上去的,
子曰好人 回答时间:2018-9-14 10:04:26
ff321 发表于 2018-9-14 09:47
( _: v2 P% F' y- A. P0 C; z, R$ n不是,我是从24V慢慢升上去的,
. z+ j7 ]( {3 p7 `' t' \
我后面尝试一下高电压再给你反馈吧,主要是现在我也没有高电压的电机,所以一直用的12V
FF_胖子 回答时间:2018-9-14 10:57:54
子曰好人 发表于 2018-9-14 10:040 W3 o6 j! X1 z, ]" E$ y9 L5 m* l8 {
我后面尝试一下高电压再给你反馈吧,主要是现在我也没有高电压的电机,所以一直用的12V ...
1 [( R* Q: u' O% x3 o* @0 D
好的,还是小心点吧
子曰好人 回答时间:2018-9-14 18:52:52
ff321 发表于 2018-9-14 10:57# Y  e  X% l' Z3 e. G8 u
好的,还是小心点吧
- N% z5 A9 u" E# n" I
上电40V驱动板坏了,底板还是好的,这个可能需要告知一下ST了
VernonBacon 回答时间:2018-9-19 09:21:24
freeelectron 发表于 2018-9-2 18:27
& [' h' @/ j1 H; Z) e: l# c0 h这个只显示了速度波形,其实要想显示更多东西,就在通讯协议里面加就好了,ST这个是串口的,板子和上位机通 ...

' w) U: `+ y4 J5 i2 F板子和上位机通讯协议是啥
子曰好人 回答时间:2018-9-19 09:37:38
vernonvb 发表于 2018-9-19 09:21
; ]7 P2 r/ F. o. C$ E) n板子和上位机通讯协议是啥

9 c! }& p/ F9 W, J; z我还没看,你可以去串口中断函数中了解通信协议
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# A( f! w. g: S! a9 t( S$ X1 m- E
MCT_Handle_t* 这个类型的指针,会报错,没有定义,然后我加上mc_tuning.h就可以了,楼主你有遇到吗? ...
9 J, I" u! U  k" {2 A
正常呀,这属于C语言基本功,MCT_Handle_t这个结构体在mc_tuning.h中定义的,你要在其他文件中使用当然要包含定义这个结构体的头文件嘛
mozartc 回答时间:2018-9-20 14:12:20
子曰好人 发表于 2018-9-20 14:08- d( }3 A4 S6 g; Q; K7 N
正常呀,这属于C语言基本功,MCT_Handle_t这个结构体在mc_tuning.h中定义的,你要在其他文件中使用当然要 ...
% B; Q: J) Z5 e6 R) p$ k
那就好,我还以为是我工程建立的有问题
gatsby32 回答时间:2019-3-11 10:49:32
老哥  cubemax怎么初试化引脚啊,你能把你的任务一和任务二的工程发给我我吗,我不知道task这些函数要添加在哪里 ,我以前没学过这些东西 ,是个菜鸟 ,望老哥多多指教啊
12下一页

所属标签

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