本帖最后由 toofree 于 2018-9-14 08:45 编辑
/ B5 ^, h: {3 s% F, ~* b$ M1 W' Z& T
【STM32电机培训】——6、任务4开放性实验转矩控制电机 / z3 ~, H% b( [3 o5 Q p2 {
8 q8 a" ]: B/ n. _任务目标:转矩控制电机,用STMStudio对变量进行监测,用ADC采样电位器电压,ADC采样值按比例间接控制电机转速。
- o8 t4 [3 Z2 J) q
) @9 D- W. }# ^! g) D
- X2 D9 s' C3 E$ @
9 R$ J- ?5 G6 U/ i8 h' C
按培训资料,使用转矩控制函数“MC_ProgramTorqueRampMotor1(Tuning_Iqref,1000);”,添加变量到STMStudio窗口
- @8 R8 s2 {0 L
- D h0 w* ?: u9 F; l: A: r
3 @4 a* z; p$ E# h1 Q' \6 s! ^ A6 o
" c' y' R8 e3 b6 N2 R6 n" G建立STMStudio工程,并将“.out”添加工程中。
( n) B h' j0 C% J
4 w1 w1 R5 t9 U1 T# {8 E, Z1 x# m- z# s( Y% a4 p/ U2 ~7 A' d0 ~
+ ~; F' z+ N% _% x
电位器ADC采样函数“MC_ProgramRegularConversion(ADC_Channel_12,ADC_SampleTime_601Cycles5);”,以及读取ADC采样结果函数“MC_GetRegularConversionValue();”。1 S5 f) J3 ]" Y) u9 m% t
此处有重点,将右侧代码照着敲一遍,改巴改巴 
V* \+ D) `5 h; m
3 `3 D5 p1 U5 n) {: {& b# e
) z, Q3 D) @& {& V) I5 A* k3 B) z- H: }
; H9 q- [1 s; `7 t* @) H" B3 F: s+ ?
0 |/ D7 ]4 m) Q& t1 @" S$ T在STMStudio的VarViewer窗口中观察波形变化。
' \+ A+ x8 T$ \4 D8 N
' F; R% r* P6 t+ ~) ~1 V. U% ]" \4 H5 G
" \- J( S6 [! h4 z$ I
代码改起:
% Z7 T5 i- F/ b9 @9 I5 f# \+ B, j本贴代码在上一贴基础上更改。, U2 f4 n) w& i. }% s+ o
【STM32电机培训】——5、任务3电机状态切换、正反转
: w+ {4 L4 p! d }7 {* fhttps://www.stmcu.org.cn/module/forum/forum.php?mod=viewthread&tid=617456&fromuid=3072970 M9 j: w- y2 T2 i R
(出处: 意法半导体STM32/STM8技术社区)
/ G- t2 W" o# X" e
9 }' s! o S8 F
1 }2 J8 _- J9 o2 F# P# @% l& x9 _- g9 `
搜索找到头文件“std_hal_missing_define.h”,将第4行的“#if 0”,改为“#if 1”。或者自己添加“ADC_Channel_12”和“ADC_SampleTime_601Cycles5”相关宏定义。
) _& u' X- C+ T( j
6 R% v' x! g, `+ w4 j; {1 V7 [" V
1 ~. C4 [( W+ i4 M6 K" V3 z
" _% F3 f* m. N o4 H: o7 B修改头文件“std_hal_missing_define.h”的目的,就是想使用这两个宏定义。或者还有其它隐藏的宏定义,反正修改、添加一下,一劳永逸。: Z3 P9 d8 z+ `% Y# g% W
+ M6 p% G, c: V
V7 I, C1 M; [9 a, N$ e4 v( [1 Z
1 k% I. q3 ^5 q+ e" ?工程主文件“main.c”中,添加相关头文件,并添加相关变量定义、宏定义。这里“MAX_TUNING_IQ”、“MIN_TUNING_IQREF”分别为2800、1000是实验得出来的。转矩太小电机低速会停机,1000是最低维持电机转动的转矩参数;2800是ADC值接近满量程时,电机才达到最大转速的转矩参数。' u2 C, H. n4 Y# S3 Z4 y1 U2 s* Z
6 C+ Q4 {) C' Q% Q8 N1 T& V e" g+ {* p
" o+ q" Y( J) ] K) w# Y添加几个外部变量声明和函数声明
4 Q: l8 t6 p0 l" H
5 I0 E$ C4 s3 X5 r6 G9 ~% m& a8 e1 T- t+ s8 B2 i9 W7 f3 R5 J
- u, @/ h# C! o. D3 P3 I" ~3 m主循环中,只执行一条“ Open_Task();”函数,此函数便是照着培训资料码好的代码。 ?: m l1 F7 ~- y' n( W
( J. S i. O& d
* L& u7 G6 @+ G/ R0 L( n/ Q( q1 u0 B2 @2 Y* k; N, |
“ Open_Task()”中“Tuning_Iqref”增加了1000的偏置,与“MIN_TUNING_IQREF”差不多是一个意思。5 K3 H6 u: M4 J- d) `
w, j: h- B" y5 U6 V; w
1 C9 V8 b0 N, {7 e3 p' f
C4 |' t1 B0 \0 z/ [. p( h7 @复制出“ Open_Task()”源码供参考。(如果嫌麻烦的话,直接下载贴子最后的打包附件); Z a. v8 z* D. Q
- void Open_Task(void)
7 [2 s2 I5 H$ N6 u - {3 I3 U: T$ n f
- pMctHdl = GetMCI(M1);
) g, l: q, |& _4 h - ! g% U, Y* _( o& Z2 |) o
- /* Do regular adc convert */
; J$ c) H" ~! y - if (MC_GetRegularConversionState() == UDRC_STATE_IDLE)( ~5 Z/ k5 w3 M0 A
- {
4 p5 @/ r5 |% Q# k0 }4 m - MC_ProgramRegularConversion(ADC_Channel_12,ADC_SampleTime_601Cycles5);) [: i: F; W6 e) L: h* c& e
- }
" X* W& p0 w- U% M T - else if (MC_GetRegularConversionState() == UDRC_STATE_EOC)
2 K3 g1 ~5 K1 |4 d# l - {
0 J- T+ s& J3 b - /* Get ADC value */- C4 |3 q3 F7 L6 M8 `
- Tuning_ACD = MC_GetRegularConversionValue();
5 h% |' R e2 [: w2 Z% I - }
% h; {- E% n# O8 { - , d# i# C8 O& r+ h/ I; O4 b/ H
- if (Delay_Count == 0)
; P- J8 f* F5 ~4 E - {# v4 ?: r: j4 G* d3 l! e
- Delay_Count = HAL_GetTick();* R5 m" F7 t, D6 H% O- N7 P% z
- }
# p4 h. L0 h- \4 p; p; p4 n+ ~ - else if (HAL_GetTick() > (Delay_Count + 1))
4 ?1 W/ U+ q3 }& g4 J7 P - {: X, ^0 g& Z A7 p1 d1 m
- Delay_Count = 0;. H) A [$ F l( @! U
- ; n2 e: c5 M5 H i& D7 s# W: |/ c
- /* Get new Iqref */
% H+ r1 X/ I" S* P& J - //Tuning_Iqref = (Tuning_ACD + 1) * MAX_TUNING_IQ / 65536;3 ]: a% i0 B/ ]/ J- G1 f' X0 x {
- Tuning_Iqref = Tuning_ACD* MAX_TUNING_IQ / 65536 + 1000;
4 c7 Z) H2 o' G - if (Tuning_Iqref < MIN_TUNING_IQREF); I6 g" ~- H' z+ E; g8 y, t( ^3 p
- {
. z$ y# k3 I+ t& g - Tuning_Iqref = MIN_TUNING_IQREF;# ]1 D" g1 {) ]
- }6 J+ ~1 m4 V4 i+ H* j, F
-
6 Z$ r" g- l8 }6 M! N4 \ - /* Set new Iqref ramp */8 Q3 }3 a5 F& q
- MC_ProgramTorqueRampMotor1(Tuning_Iqref,1000);
8 m$ O/ f* ]5 j d; A U) { - MC_StartMotor1(); 8 h( t5 M, Z7 D4 R5 r* ~
- }- m6 A6 D0 Y) ]% o
- }
复制代码 6 \; c# |% M [& } X3 N
; \& H; y0 M* ^7 X! B
+ z( s5 c- \ r, F+ {编译IAR工程。下载固件到开发套件中。
1 G5 h0 E; i: }5 n% T8 U1 f4 N0 \8 G# g5 |5 T- R
/ v3 _: T0 W, c8 `2 Q2 e打开“Workbench”界面,并与目标板套件连接。6 a8 t Z- v& u1 G# x& T
% M9 r1 M P6 v! |/ L/ ^6 n( b8 D- _
U8 U, v1 D; \$ d! @在“监控”窗口下,在打开“Plotter”绘图窗口。* m7 f4 _, B+ q: F+ B, M2 S
. c. @) I9 O5 ~# B1 o5 Y, U
7 g) Y4 Z/ M9 H! y, o. l
* S8 [: L9 |/ F$ C9 J电脑安装,并打开软件“STMStudio”。
0 p% n. F' Z9 y. N
) o. N( e4 ?, ^5 y
$ e" O B/ {7 v+ L2 ]) t, @: s5 @* M6 f, ?3 p* Z
将本实验IAR生成的.out,导入到“STMStudio”工程,并且添加监测变量到两个“VarViewer”窗口。为什么用两个窗口,因为ADC有采样值变化与转矩不在同一范围,如果在同一窗口,一个波形幅度太小。
8 P7 D1 f& q' } D1 \9 ]9 W
* x/ n1 I# z7 \
+ Y2 l8 Y* H9 Y8 o1 H0 Z
8 O3 ]1 [9 w6 x% o+ ^9 H# ]) p
运行程序后,在“Workbench”的“Plotter”绘图窗口观测电机速度,转到电位器,电机速度变化,相应波形显示有变化。
: e3 `' S. s8 i6 f3 g; t. e9 |' x
1 b9 q5 W+ J5 l& m* A$ ~2 k
3 P( n" ?7 E2 r d* |$ w {% b1 d% n
同时在“STMStudio”的窗口中也将观察到如下图变化波形。
7 W- S1 u, B8 Y$ O/ t
" O7 Y% _# q( \% @# I! c8 t, M0 V/ G( t# ]
4 N: x: t1 k* ]* K( O( {
至此,完成了开放性实验的转矩控制电机,并在“STMStudio”观察ADC、转矩任务。(之后,重开贴,整理一下“STMStudio”使用,其中会有一个小贴士分享。)1 v$ ?" }$ N0 \% x
0 E% K& J5 ~: \. K4 y
$ c+ A/ y$ V3 i0 G" x: u按照惯例,工程附上:0 M/ v T/ ?2 v6 ?1 X( v8 W/ s% Q- ^
8 l: v* X$ S; V$ l% B; }# x; M/ K
P-NUCLEO-IHM001_STMStudio.rar
(9 MB, 下载次数: 79)
|