培训手册里 实验2:基于MC SDK5.0 API速度控制与电机启动停止。1、实验2内容:
1 V" x" y* e- \2 T; A. i 2、程序代码,在上篇实现的代码的基础上,修改代码如下: main.c程序里面添加内容6 f) O/ N+ K) s0 K. v( y* f //-----------------------------, E4 X; M* D( w) D) e/ H( R //定义变量) r# J+ y9 l7 M3 ^! J /* USER CODE BEGIN PV */$ Y) s( _7 H3 k7 T4 `- r /* Private variables ---------------------------------------------------------*/+ m$ S* S3 e$ y/ W% T. }' c: L. [ static uint32_t delay_cnt=0; //延时计数 - U% j c/ h, d; p6 K3 @. E static uint32_t delay_cnt1=0;0 a, G8 r: H$ ]; o, P/ {& A, t static uint8_t delay_start_flag=0x30; //延时启动标志位 static uint8_t delay_5s_flag=0; //5s时间到标志位- L. ^' `1 A: Q7 d F g0 S static uint8_t delay_10s_flag=0; //10s时间到标志位 /* USER CODE END PV */ //函数定义 /* USER CODE BEGIN 0 */0 p9 x% N7 I7 Q //定时器处理. k' V+ P& u6 A" E t: {1 V void Delay_Handler(void) { delay_cnt++; if(delay_cnt>2000) //1s计时% g/ q' F8 i; C0 S2 p/ O, O {# J& [2 p V( p5 t, w& ~1 k delay_cnt=0;: L- k7 O9 N$ {9 K P7 }$ m$ K" W HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_9); //定义示波器看时引脚( d1 u2 m W! n# g //----------------------------------------) T- N3 }- F9 h* g2 L1 C+ s if(delay_start_flag==0x30) //启动10s计时 {) h7 t& U* i4 k& {# C9 N delay_cnt1++;7 R' h7 E( B' o2 M if(delay_cnt1>9) //10S* e) g3 @$ ?$ ^3 s1 i2 t3 i {6 @( \' h* f- n; {! J0 V8 x) R delay_cnt1=0; delay_start_flag=0x20; delay_10s_flag=1; //10S时间到标志位 } } else if(delay_start_flag==0x20) //启动5s计时9 R: ^( q, I; {; S/ o {1 [) n7 a) |* g1 K delay_cnt1++; d' n) }: o' ^ if(delay_cnt1>4) //5S2 w) R5 R5 j& I7 c {: y0 N5 y& `$ t( a0 B5 ^ delay_cnt1=0;) ?' M) w7 } J delay_start_flag=0x30; delay_5s_flag=1; //5S时间到标志位2 P: b% z B" g, ?* {$ o } } } }8 D' z* p3 [, A6 a2 b2 x int main(void) {( c- ~) F: }2 q$ X /* USER CODE BEGIN 1 */ /* USER CODE END 1 */. q, I4 Y- O' ~' }6 f * N$ b, ~9 _8 \ q1 ?+ ^2 _ /* MCU Configuration----------------------------------------------------------*/ 8 y( j$ `: g& j$ y9 q1 S * b f. O( {& R& r8 { /* Reset of all peripherals, Initializes the Flash interface and the Systick. *// w, u( A$ p' D6 ^4 e HAL_Init(); ( n( l M/ K/ g' y 2 j& J! `- P I" u0 t; f+ [3 J /* USER CODE BEGIN Init */1 `7 {9 }" ~ P: f ! ]+ B# g1 k( }5 y# j# C ! n+ e1 F! R8 V _% m /* USER CODE END Init */ ^) l5 c" w( ^' U Z ; @& z* ~, M; h A/ ]0 O4 I /* Configure the system clock */# c/ a6 H& X2 P' D+ E7 P2 V0 ^; o SystemClock_Config();0 x; ]: b' w! f8 s: u /* USER CODE BEGIN SysInit */ ' I: _9 E$ g( E3 J @9 j 8 [( I! q$ W- L. ^* H /* USER CODE END SysInit */. ?1 q0 `" B- J' v( L /* Initialize all configured peripherals */) s; e" O. r2 U" U; C% T6 F MX_GPIO_Init();8 U4 t4 w* ^# @ MX_ADC1_Init();1 j' Z2 z. Z% ^" k MX_DAC_Init();- ^; `+ I, ]2 j3 ?+ n- U9 I MX_TIM1_Init();4 J+ Q8 G( z1 \7 _) Z2 X, C MX_USART2_UART_Init(); MX_MotorControl_Init(); /* Initialize interrupts */ MX_NVIC_Init();2 }4 E) `+ I8 D+ O! H% x0 F /* USER CODE BEGIN 2 */ MC_StartMotor1(); //启动电机 MC_ProgramSpeedRampMotor1(3000/6,1000); //1s内加速到3000RPM6 g, d8 q! w+ Y5 Y; c! s 8 ?) w/ c" o' c3 h [ & {( E3 ^+ M/ O; P/ {" z /* USER CODE END 2 */ /* Infinite loop */" x; F, b" c- A+ G% v7 ~# u /* USER CODE BEGIN WHILE */ while (1) {) J" J3 g4 ?: k% X+ u* p& D /* USER CODE END WHILE */ S1 W4 K3 b- u9 v5 V 4 F; t1 A' N: q$ E+ N! f$ Z* A /* USER CODE BEGIN 3 */ if(delay_10s_flag==1) //10S {; `& T$ y6 V& f M MC_StopMotor1(); //停止电机运行; z% k; K# d- R9 I* b# E/ A delay_10s_flag=0;- _% p! N, F6 k# N: N: a9 z } if(delay_5s_flag==1) //5S5 h h; j u4 M. H { MC_StartMotor1();$ U: e7 }7 K9 I) F4 c1 | delay_5s_flag=0;' E% C$ D( l8 Q/ Y3 f q }' j# q1 q" E" j! d } /* USER CODE END 3 */& p( `9 V" R( \1 z" X 7 D3 z& ~7 Z) H # w+ w: H+ ?! C9 N2 n/ i7 R: G } /* USER CODE END 0 */ ' h5 O. ~$ \/ G- k* V* Q 5 Z6 W9 F( K; e2 z9 M stm32f30x_mc_it.c 程序里面添加内容: 在滴答定时中断程序里面调用定义的函数8 ]" q1 { w% n void SysTick_Handler(void) W! r3 z% o: x {$ o4 H- P8 `6 a. Q #ifdef MC_HAL_IS_USED static uint8_t SystickDividerCounter = SYSTICK_DIVIDER; /* USER CODE BEGIN SysTick_IRQn 0 */9 ?( l' g, f) o; r, F) c2 F / [* P7 b' Z2 o4 O; q /* USER CODE END SysTick_IRQn 0 */" u B& q7 _2 x3 H. A5 D; u if (SystickDividerCounter == SYSTICK_DIVIDER)# @. S! {" Y) V% z4 I0 l J) j { HAL_IncTick();% [( l# V) J/ w HAL_SYSTICK_IRQHandler();$ @7 }; A5 k0 n3 f; c SystickDividerCounter = 0; }* H( F6 k- w- K; A SystickDividerCounter ++; + R: W& }8 }" ?& h! c #endif /* MC_HAL_IS_USED */+ s: Q$ r$ X' L9 _$ s4 r 3 d% W9 S7 d3 d8 k7 S; j M /* USER CODE BEGIN SysTick_IRQn 1 *// Q' o6 Z8 S9 b W3 ^" `- c$ y /* USER CODE END SysTick_IRQn 1 */ MC_RunMotorControlTasks(); /* USER CODE BEGIN SysTick_IRQn 2 */ Delay_Handler();1 m& Q$ ~8 p7 V! M8 D& R; } /* USER CODE END SysTick_IRQn 2 */2 x* \$ t% m. a3 p" M J }: S6 f8 m% E2 g+ Y! [! `$ ]# \6 X ( q* t7 p0 ]: P1 z# _. }- l: w . y% ]; z5 @5 h4 E5 A* n+ Q A5 S 3、测试波形:$ f% V, u/ z; @6 z0 z. o3 I 在程序定义PC9为输出,观察滴答定时器的定时时间,滴答定时器的时间周期为0.5us ,程序处理后变成1s定时周期:
监控电机运行的图片:
( T" |8 }! B' X. r: b3 u % K; T0 B8 k4 C$ e! i 3 i! H) U+ k- U5 \ 7 z$ n. l# `5 n8 q3 K; x# h. _ , d7 l& C9 D- Z; q/ i ( {0 Z9 A3 U# }1 B- J$ x ; F" x7 g' ]! a- O+ c * v& F7 x' ]8 _( ^& ] $ M9 W) L% C$ S. L5 f b% \9 G5 ~ % j& B' T- S& F: {+ N 4 t9 `/ f. e3 D5 ^7 }# \4 ?# r |
微信公众号
手机版
共同学习