本帖最后由 toofree 于 2018-9-14 08:45 编辑
9 b( g$ B% V9 N4 Q5 f$ r$ B7 v9 c" R3 f) `$ f* m G
【STM32电机培训】——6、任务4开放性实验转矩控制电机
6 B3 T2 ~: b' j3 @) X
* C5 Q; p8 M X* x: D4 _任务目标:转矩控制电机,用STMStudio对变量进行监测,用ADC采样电位器电压,ADC采样值按比例间接控制电机转速。5 L+ u5 _+ t, V% w& b7 j
- Z0 I+ C+ P/ W. }( z& Y! ^. z' g5 a* C& Q: N" C/ [
" Y& F1 T* P/ `) Z @
按培训资料,使用转矩控制函数“MC_ProgramTorqueRampMotor1(Tuning_Iqref,1000);”,添加变量到STMStudio窗口
1 a0 J3 \0 p0 ?* T
`7 ^. Z* B! F0 C& J
5 J+ K5 e" P3 a5 ?. B7 P' f' k# C/ m8 q
7 h) h6 Z* _) h7 u- t
建立STMStudio工程,并将“.out”添加工程中。- R- p2 \0 R* B/ S/ `
) c- `+ [) V( F. Z& f% ~! ~; m7 `: G% Z5 u: T
~) N9 w+ Z R6 {! U1 f S% n: R
电位器ADC采样函数“MC_ProgramRegularConversion(ADC_Channel_12,ADC_SampleTime_601Cycles5);”,以及读取ADC采样结果函数“MC_GetRegularConversionValue();”。( l; O2 U3 }6 F, i
此处有重点,将右侧代码照着敲一遍,改巴改巴 8 K' P; ?7 C. ^0 ` _% y& q$ ^
5 e, Z1 J3 Y) V& S( }3 y
8 e: U/ q) J3 P& h9 ]+ o2 Q8 [
6 J1 V$ d. A- i: a2 L3 N7 {1 H
# B1 M8 U7 t& @ Q0 |( h
- d# x/ }- F% ^4 Q, |在STMStudio的VarViewer窗口中观察波形变化。
8 m: t# @& H4 R' c* R
7 ~0 c) | O1 W" H
* S' L) {7 S. O, j8 R' K: X
0 W3 o O/ H5 u+ h: s u( \代码改起:
2 m: w$ W3 q/ |# z( ^本贴代码在上一贴基础上更改。
8 |- F" Z. U3 |8 ?4 G【STM32电机培训】——5、任务3电机状态切换、正反转; O/ f) m* ?/ M2 q
https://www.stmcu.org.cn/module/forum/forum.php?mod=viewthread&tid=617456&fromuid=307297
! ^4 ~9 r. q, H% d. K% X+ A+ [(出处: 意法半导体STM32/STM8技术社区)
3 R$ Q0 U, X) w- Z
: d8 g2 a/ _+ G/ H8 Z- |" x2 A7 h5 q. _; |
8 i% E' s. k% e9 j+ M
搜索找到头文件“std_hal_missing_define.h”,将第4行的“#if 0”,改为“#if 1”。或者自己添加“ADC_Channel_12”和“ADC_SampleTime_601Cycles5”相关宏定义。' I; T; \/ I$ p+ O6 |
3 J @+ c% `7 t# ^' y) b- G ~
7 n4 A% q% w0 y; h/ b; [& e" B
% h8 d, m2 z& Z! m& H/ o V( W修改头文件“std_hal_missing_define.h”的目的,就是想使用这两个宏定义。或者还有其它隐藏的宏定义,反正修改、添加一下,一劳永逸。
0 N; o* l$ u& [9 c
, `! c# U: V) I
x) M9 l8 l3 v1 L! b% H9 c* ?
v+ p/ t: k( f2 B( q% t; o3 l3 N: T工程主文件“main.c”中,添加相关头文件,并添加相关变量定义、宏定义。这里“MAX_TUNING_IQ”、“MIN_TUNING_IQREF”分别为2800、1000是实验得出来的。转矩太小电机低速会停机,1000是最低维持电机转动的转矩参数;2800是ADC值接近满量程时,电机才达到最大转速的转矩参数。
2 M. F: R: P8 E0 U" @
* z" E- @- F0 Z+ E# ]% l+ `8 W! _. o0 |% M% N4 J
0 ?, l' n0 y3 E. X8 x" ]添加几个外部变量声明和函数声明
' k7 e* D! y5 R0 u: r0 U. l
. x- T h6 O2 v; d
! a; g5 M. q* A N. o) N1 t0 U& f) S9 J& ^( h! u! n! d
主循环中,只执行一条“ Open_Task();”函数,此函数便是照着培训资料码好的代码。
/ ?3 P. ^/ {- }' m
% o2 F& S( y9 a* c- e$ [$ | A/ M& ?( f: R/ |8 B+ p
# R9 [2 T* j3 m2 G# R
“ Open_Task()”中“Tuning_Iqref”增加了1000的偏置,与“MIN_TUNING_IQREF”差不多是一个意思。
A, d. R6 H! Z+ N+ t
8 A# q' I& l" c$ J# G" c
* L. ?# P Z2 o) s( L6 r3 M9 u
& `! m: s5 G3 ?; f5 V2 D2 p复制出“ Open_Task()”源码供参考。(如果嫌麻烦的话,直接下载贴子最后的打包附件)
3 m" W/ m5 V, U/ ?- void Open_Task(void)
5 _0 ^6 ?. ]7 P, u2 v/ D) z& x2 M - {
% o2 z% F/ Z4 w. v - pMctHdl = GetMCI(M1);
; ]9 Z3 V9 u+ l! I% z -
5 n+ T/ W: v* M( y! C( w1 g: B - /* Do regular adc convert */
0 A0 y2 H2 q8 O, K, K, C4 P - if (MC_GetRegularConversionState() == UDRC_STATE_IDLE)' n( O, j I& [& n4 j
- {
/ c; C( N( G' E8 ~( c$ i. \ - MC_ProgramRegularConversion(ADC_Channel_12,ADC_SampleTime_601Cycles5);
5 n- |" h. f7 D \- W% K - }
: ~3 x" b8 q: s - else if (MC_GetRegularConversionState() == UDRC_STATE_EOC)1 H4 |; h# D5 B/ y U1 N2 Q1 E: Z
- {
) ~* I h9 H# v% k9 r. S - /* Get ADC value */
' N3 J# t5 i: l, m% E - Tuning_ACD = MC_GetRegularConversionValue();4 ~% `" J$ l* i3 ?6 G1 w) k
- }
* |. q& N) f+ H" \5 s* _( M4 P
! P, b( h5 b! f' t5 k2 y- if (Delay_Count == 0)
7 J4 m* y& m/ }' _- s - {
% d! k, e! a1 h6 ?* s9 o, o" _ - Delay_Count = HAL_GetTick();
9 w. j7 i8 \) s5 {, a% c2 w - }
: V0 k5 u6 t! S h9 A - else if (HAL_GetTick() > (Delay_Count + 1))) t( w- X* H% V$ U
- {
1 `+ g3 n3 V$ ` n; ` - Delay_Count = 0;
7 D+ T/ ^& t2 ] z - 8 ^, {& ]6 M$ t- ^0 ?3 k$ [' ~1 H
- /* Get new Iqref */0 g/ V) ^7 G! I2 N, q" n
- //Tuning_Iqref = (Tuning_ACD + 1) * MAX_TUNING_IQ / 65536;
1 Z: X" a, a; F - Tuning_Iqref = Tuning_ACD* MAX_TUNING_IQ / 65536 + 1000;' q" K/ z' ^9 t" L
- if (Tuning_Iqref < MIN_TUNING_IQREF)
$ Q& l1 S. v/ W) R# B, N C4 u - {# e* K# ]( [/ J( g
- Tuning_Iqref = MIN_TUNING_IQREF;
2 m4 I; I7 R( x/ H1 k - }. w! G; T+ g' I( o7 \
-
) j& ~! h5 C' e# F, ` - /* Set new Iqref ramp *// ~# i( B" g1 M9 m" u
- MC_ProgramTorqueRampMotor1(Tuning_Iqref,1000);
~# [4 x+ d+ g, h7 m0 a3 x& a - MC_StartMotor1(); % i- u m: t% y8 n% u# {8 A) |
- }
* |/ T, v9 E, M- U% Y+ P - }
复制代码
% g3 t9 ]/ t2 a' e$ C$ @
2 P' N3 W3 M7 k/ l
" ?" H" E! l7 z( b. r编译IAR工程。下载固件到开发套件中。
N! |% e% n% @9 y# o4 Z4 W2 I3 D- l( e( T% i
7 V! d" b1 q0 ~+ T: }打开“Workbench”界面,并与目标板套件连接。( m. M* o" I) x6 j( w; v
6 B) Z6 N2 S+ y. b
. H$ W1 |% c% V% A0 J, {1 k$ |
在“监控”窗口下,在打开“Plotter”绘图窗口。# Q" ]1 t6 @' y; D$ G4 V. z, M& @
6 c" M: c6 }7 T+ H3 s+ U& \' O2 n% U" x
6 }9 e( {5 r6 L" U/ R
电脑安装,并打开软件“STMStudio”。+ r1 |0 q1 b i$ ?
* e' J: Z7 |2 B5 q; \2 Z0 c+ T+ E/ b
' p( j+ N/ y9 V$ B1 L. J
3 X$ N( C/ p5 P" P2 F7 l9 T: B将本实验IAR生成的.out,导入到“STMStudio”工程,并且添加监测变量到两个“VarViewer”窗口。为什么用两个窗口,因为ADC有采样值变化与转矩不在同一范围,如果在同一窗口,一个波形幅度太小。
$ c/ `/ u) Y2 e4 B5 |+ x' u
$ n9 t3 e; z7 T' ?6 o
' c" n/ ?& z' X6 O" w
0 {$ i* m6 z8 r8 q z运行程序后,在“Workbench”的“Plotter”绘图窗口观测电机速度,转到电位器,电机速度变化,相应波形显示有变化。6 S0 ?! v0 N5 P* B
: \9 J5 ^; H% \+ a$ D
! c0 A( W" ]) {" G* g) \* C9 D
& M9 b. ~- D: c" V2 {0 Q; z y
同时在“STMStudio”的窗口中也将观察到如下图变化波形。
+ V' O3 Q8 q( J+ G& @: H7 ^
: G% l7 I( T3 |5 [
k+ r# P# Z; M' n* }6 W4 S% [ u+ e; h. [0 E' g4 l& ^
至此,完成了开放性实验的转矩控制电机,并在“STMStudio”观察ADC、转矩任务。(之后,重开贴,整理一下“STMStudio”使用,其中会有一个小贴士分享。)
9 T" q* q+ z* J1 t7 [& i0 `# s' r" k: O# f1 n, Q d* f1 o! d) |
+ h( |: M5 N7 ]3 u6 v4 _6 a/ J: o
按照惯例,工程附上:
# n$ g5 _2 I( ]( m- s$ n2 Q; ]3 R# q# f: |+ H
P-NUCLEO-IHM001_STMStudio.rar
(9 MB, 下载次数: 79)
|