本帖最后由 toofree 于 2018-9-14 08:45 编辑 ( ^, N7 x, r: }& W& n2 N
, i; z; d: ?) R" H! Y$ [0 w[size=13.3333px]【STM32电机培训】——6、任务4开放性实验转矩控制电机
7 \" d& D) n! `
! N* b* a* I2 E. B* m任务目标:转矩控制电机,用STMStudio对变量进行监测,用ADC采样电位器电压,ADC采样值按比例间接控制电机转速。
# }7 K$ u o9 A+ [/ u+ D" g
3 Q$ }! ?. {* [
|3 `( G" P9 D( |
4 }$ }$ _2 Z8 }' x: D, U
按培训资料,使用转矩控制函数“MC_ProgramTorqueRampMotor1(Tuning_Iqref,1000);”,添加变量到STMStudio窗口
v" \/ {. U. f3 ^: K
: o* q: Y7 v7 |2 x& r
) J" M7 S7 s6 A1 P* l3 t
/ n8 f( |0 l# E建立STMStudio工程,并将“.out”添加工程中。
+ I) y! k8 l5 \1 h7 J3 P$ i
; h+ t) [8 ^$ h" u+ C
O9 S( B h6 A }! i0 \% }. m
' t1 q9 t+ M' p/ H. l电位器ADC采样函数“MC_ProgramRegularConversion(ADC_Channel_12,ADC_SampleTime_601Cycles5);”,以及读取ADC采样结果函数“MC_GetRegularConversionValue();”。
8 c6 b" C+ y$ F# u2 Z* ~此处有重点,将右侧代码照着敲一遍,改巴改巴 5 l) K7 g) H, K$ T( f# y
. V+ a( D+ X# r/ U/ M |
. y; ]. w* m0 I: X3 `5 u3 X4 d& J9 ^; W' \
" D; l! W2 P& w C( [. h+ X7 |) K9 u2 }: M* ^' ^! T
在STMStudio的VarViewer窗口中观察波形变化。5 _! c: B( m8 b' j: g
& `- Y3 o2 z3 h$ _
# r/ u1 R+ x& @6 a& ?% O! K) W% c+ K4 P; Z
代码改起:2 X- @" `' i) Y9 \( R2 L
本贴代码在上一贴基础上更改。0 R1 r, i* \3 E) i0 j5 f3 Q7 j
【STM32电机培训】——5、任务3电机状态切换、正反转
3 Y- P, z! z- c$ u; J4 Zhttps://www.stmcu.org.cn/module/forum/forum.php?mod=viewthread&tid=617456&fromuid=307297+ W/ s# I4 V5 L, q8 j
(出处: 意法半导体STM32/STM8技术社区)$ d4 Y7 m9 ^0 A5 p% q/ u% q
5 W& A4 C8 X* S1 Y1 e- v& I
; P7 Q; h; n* K/ V
}8 U p: [: C搜索找到头文件“std_hal_missing_define.h”,将第4行的“#if 0”,改为“#if 1”。或者自己添加“ADC_Channel_12”和“ADC_SampleTime_601Cycles5”相关宏定义。
, L A+ }8 S1 k7 C5 g
8 c. d: `4 K3 Y2 u! c
+ `0 L5 |. M; ~6 \" g
` U6 f7 X+ T- Y# c1 Z6 o7 r0 ?
修改头文件“std_hal_missing_define.h”的目的,就是想使用这两个宏定义。或者还有其它隐藏的宏定义,反正修改、添加一下,一劳永逸。! u0 Q O& f5 G* C# c
. ?" S' ?) A# J: U* B, Y
) U8 C6 V1 c i1 |
8 p5 u4 i8 x" Q% i, h- u工程主文件“main.c”中,添加相关头文件,并添加相关变量定义、宏定义。这里“MAX_TUNING_IQ”、“MIN_TUNING_IQREF”分别为2800、1000是实验得出来的。转矩太小电机低速会停机,1000是最低维持电机转动的转矩参数;2800是ADC值接近满量程时,电机才达到最大转速的转矩参数。
, G* [; U& W7 Z) u$ S' |' _
3 v' |" O2 Y# c6 Z9 M6 z0 R1 H! Z, h; D& c- a7 T
/ Z6 t; j8 _$ n6 d- a# H8 a8 p( s
添加几个外部变量声明和函数声明
6 ~! W, P) o d+ x: f, {
% {0 e$ G, o! B# p4 W3 {; d
' X! t: }* c, ^% M: j/ |. N- r' Z" D* ]; e1 L
主循环中,只执行一条“ Open_Task();”函数,此函数便是照着培训资料码好的代码。
4 F6 t( B! p) Z0 S% H
6 P+ k4 u; E2 ^5 B. R; D: i0 \) ~. y* T
0 @8 X: R8 D e3 o' [. M“ Open_Task()”中“Tuning_Iqref”增加了1000的偏置,与“MIN_TUNING_IQREF”差不多是一个意思。, y5 t' H; k: g8 E) S
! K3 z: t5 w; j8 t8 ~) F/ W# r9 |3 B
' u: G* L4 i) L- Y' Z3 ]
, _! a2 d% V% A1 y$ D6 a4 F) ^
复制出“ Open_Task()”源码供参考。(如果嫌麻烦的话,直接下载贴子最后的打包附件)
8 z/ R+ ~$ ?! f1 Q" _: C" N$ {- void Open_Task(void)
7 \& x$ Y3 q9 H - {
1 z! H- u7 f5 Y& S! @, @ - pMctHdl = GetMCI(M1);. p8 A! Y$ O5 I8 @/ Z
- 4 y" x1 `( ~# k% t; J5 c4 R7 [
- /* Do regular adc convert */
5 ~& c8 o9 B8 x5 w, F6 L - if (MC_GetRegularConversionState() == UDRC_STATE_IDLE)
: B- |1 M( G8 n - {9 ?3 |7 U7 l0 ? @% w4 E
- MC_ProgramRegularConversion(ADC_Channel_12,ADC_SampleTime_601Cycles5);3 _" k" c4 I/ a* ~! c3 z- E% D) c! s
- }
& J0 ^5 u* T- R! r3 h - else if (MC_GetRegularConversionState() == UDRC_STATE_EOC)
- A9 j+ v% V! S. C0 i% } - {/ l+ P0 ~7 G, M* P0 J0 I
- /* Get ADC value */6 L3 C; d4 V+ ~3 ]
- Tuning_ACD = MC_GetRegularConversionValue();
5 P9 G% t9 T8 q. |4 S - }
9 K% @9 b! Q& `$ \; e9 U. n/ J - 1 N& X x" @, }, ] f3 E
- if (Delay_Count == 0)
6 l) E: b+ p" P. H! R2 ^/ i @ - {# A$ I$ b: D* J6 j3 i+ _
- Delay_Count = HAL_GetTick();% d4 e. ]) U; _
- }6 H! C* S( W( D
- else if (HAL_GetTick() > (Delay_Count + 1))
0 y: e. d9 @6 x - {
7 t3 X: d3 `9 h; z5 i - Delay_Count = 0;
; ]) \5 G0 G8 s. I - 2 R' m1 |1 S- h9 r* R- j
- /* Get new Iqref */: T7 E3 @2 ^; B5 S
- //Tuning_Iqref = (Tuning_ACD + 1) * MAX_TUNING_IQ / 65536;
3 `7 n0 h3 j3 g0 i9 u - Tuning_Iqref = Tuning_ACD* MAX_TUNING_IQ / 65536 + 1000;
4 g8 Q4 g1 ]& g8 t$ k - if (Tuning_Iqref < MIN_TUNING_IQREF)
5 u# [8 l3 E3 V: E# @3 i1 H - {% h- h1 h j! l* K. U1 L, p7 p
- Tuning_Iqref = MIN_TUNING_IQREF;
0 s/ P, R1 V u! k% k( _ - }# Y4 `6 ?/ o5 Z: o1 I" \
- 2 A4 P+ S0 O. g7 C O
- /* Set new Iqref ramp */ C1 X5 }) Z; }
- MC_ProgramTorqueRampMotor1(Tuning_Iqref,1000);
9 ?; t; l7 P3 _' R) }5 S - MC_StartMotor1(); ( w: T, K* a; x+ a& }+ h& G6 G
- }3 N1 }% r/ I; U X0 Q* l
- }
复制代码 ; h4 o+ V9 j1 o |, |: {$ a
& Z/ U) m* y: ~6 }2 H9 z( a2 C W! O. C ]2 m! E, e( ~% j8 x
编译IAR工程。下载固件到开发套件中。' K2 ]9 T" b \0 `
& s) f9 |3 s4 q% J& E; [& Q1 O
6 h$ s U0 z; R打开“Workbench”界面,并与目标板套件连接。
# U% ]4 ]. p5 l$ z9 n
, k' G( z! Z! k' j" S. F2 y9 M: X" L4 Z0 R) d; }. l
在“监控”窗口下,在打开“Plotter”绘图窗口。
" O$ H2 t4 m% V0 a* X
) E! i) ~0 Z5 {/ j! }
1 W) a; b5 H7 B- i
5 @9 X# A2 G1 F电脑安装,并打开软件“STMStudio”。5 A5 g5 W! P9 w- w" @/ l
2 u5 P* B8 r0 E4 l7 r" q4 X$ f) t* `/ ^# L# B
0 R, P" p4 u/ S& k0 h0 B将本实验IAR生成的.out,导入到“STMStudio”工程,并且添加监测变量到两个“VarViewer”窗口。为什么用两个窗口,因为ADC有采样值变化与转矩不在同一范围,如果在同一窗口,一个波形幅度太小。
& P% ?1 l/ V4 x Q0 E" F
4 }. a. u% e- n% Q& f2 N# \3 K* I
2 T, L& w; W; q" c# d$ m
1 L: @. O8 v$ L; @; d: C运行程序后,在“Workbench”的“Plotter”绘图窗口观测电机速度,转到电位器,电机速度变化,相应波形显示有变化。8 H0 `" C+ c- [
8 X/ q! F# u+ `, E1 e: |2 f
3 m3 c3 G( d3 u. ^2 k
7 t' y' t. b) I H
同时在“STMStudio”的窗口中也将观察到如下图变化波形。
' K+ t8 o3 Z4 h! k8 c4 u8 o E
; A/ a1 g1 d: L" Q: m3 u: l
. q+ c3 @9 J) o8 | S+ {
5 T9 S! l. Z6 b* m) G& }至此,完成了开放性实验的转矩控制电机,并在“STMStudio”观察ADC、转矩任务。(之后,重开贴,整理一下“STMStudio”使用,其中会有一个小贴士分享。): \ e8 g! l! F7 t# S& j# e' W
: Y3 `/ i: y" ? ^
0 p: s7 X6 a1 p按照惯例,工程附上:
9 [/ \1 C6 j& Q: z" |( S6 z1 L5 O6 [9 |1 o8 ~. N) l. u- h4 v" L5 q
P-NUCLEO-IHM001_STMStudio.rar
(9 MB, 下载次数: 79)
|