培训手册里 实验2:基于MC SDK5.0 API速度控制与电机启动停止。1、实验2内容:: z0 J. ~+ Y6 |; o% h. ^ 2、程序代码,在上篇实现的代码的基础上,修改代码如下: main.c程序里面添加内容 //----------------------------- //定义变量3 c$ `! y6 X4 O! I- ~# w0 M' N5 u /* USER CODE BEGIN PV */& O+ F6 |, x, ?1 G /* Private variables ---------------------------------------------------------*/ static uint32_t delay_cnt=0; //延时计数 7 F. T1 J. W! I% C" G static uint32_t delay_cnt1=0; static uint8_t delay_start_flag=0x30; //延时启动标志位$ ?7 V% Q( B8 ? static uint8_t delay_5s_flag=0; //5s时间到标志位 static uint8_t delay_10s_flag=0; //10s时间到标志位 /* USER CODE END PV */ //函数定义 /* USER CODE BEGIN 0 */ //定时器处理/ I1 e+ `' j. _- k1 j6 u void Delay_Handler(void) { delay_cnt++; if(delay_cnt>2000) //1s计时& K7 A6 c' }, ]/ X" s {* K* _* \8 @6 ` delay_cnt=0;7 G* T# L1 @" M4 c5 z* C0 l* Y$ g HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_9); //定义示波器看时引脚1 d, _$ q) @; y0 B. ?2 R/ t, f- r //---------------------------------------- if(delay_start_flag==0x30) //启动10s计时 { delay_cnt1++; if(delay_cnt1>9) //10S {( H: v4 t, L; R% V5 i4 P2 e8 L delay_cnt1=0; delay_start_flag=0x20; / g' U9 b* y h* l+ `2 D delay_10s_flag=1; //10S时间到标志位1 \# g* u& z1 A# h% G: y, V `6 v! x } 8 C! b1 f! T. P$ e9 J0 ^5 R" u }8 d' M: O4 b. n2 R& ? else if(delay_start_flag==0x20) //启动5s计时( ]2 Q. P5 I% F- F' U! z* e" w$ b { delay_cnt1++; if(delay_cnt1>4) //5S {1 M$ J( `0 r3 w delay_cnt1=0;! B" |( g2 s' W H( s delay_start_flag=0x30; delay_5s_flag=1; //5S时间到标志位6 R/ d. h3 z* d( {$ `# P4 F }! v! o) h* x6 p* ^: }% ^# Q5 n } } } 7 f! @. E/ C6 C/ N% x$ o% J7 U- Z+ y int main(void)* J# T& {1 O1 L# B& o" O; f8 L. g {$ s6 E4 z6 f: j& b5 s1 x /* USER CODE BEGIN 1 */ 8 l6 B q6 P0 a /* USER CODE END 1 *// o+ c' L3 h6 I3 n" ~ 5 T1 V2 J2 e Q' N- a6 Z& ^ /* MCU Configuration----------------------------------------------------------*/) Z7 y8 \: Q& D5 G) G! X 8 v$ r0 n4 Y+ D* ] /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); ' l+ Z5 l) @% ^9 r; l2 `- w . U i6 C9 f, U: I /* USER CODE BEGIN Init */0 |8 m$ u- F2 X }( v5 R G% z /* USER CODE END Init */ $ ~& r$ S. _/ ^6 y # I H: O4 _+ [6 f; {1 h /* Configure the system clock */% A( ?( j9 o( p7 }8 X1 ] SystemClock_Config();7 B/ ?: `& {6 q # q; L m2 x* _( t7 h ! G: q! z4 Z& O' B /* USER CODE BEGIN SysInit */ - ?0 ^; O9 V: S3 }, U# F /* USER CODE END SysInit */ /* Initialize all configured peripherals */) O8 H) F8 x% R& P. M% z MX_GPIO_Init(); MX_ADC1_Init();0 j# S7 H* o' V0 m9 K/ Z) ~ MX_DAC_Init(); MX_TIM1_Init();" k4 o9 y% s2 y, S MX_USART2_UART_Init(); x% H5 P) v; _ MX_MotorControl_Init();$ i, w4 Q8 i- G/ _* A( I" u ( V0 T( d, C: {$ S8 _6 f 8 }! I: I4 `. W& b( D$ K( z. k /* Initialize interrupts */ MX_NVIC_Init(); /* USER CODE BEGIN 2 */ d& C/ z I& J MC_StartMotor1(); //启动电机 MC_ProgramSpeedRampMotor1(3000/6,1000); //1s内加速到3000RPM0 y8 S1 f! ^4 P! X- e / _( [2 l8 a& I$ J /* USER CODE END 2 */% H/ D( O/ `( p9 ?5 L. ?; C. J 9 q, y$ x" R) J 9 X/ C2 S+ e* `# n/ q( \; y /* Infinite loop */ /* USER CODE BEGIN WHILE */4 M5 B! u. W2 W% k' K5 @3 |- o while (1): y! |" e+ I" ^* s6 E4 J3 d { + ~7 f: U; L1 j$ [ 4 N: }. @. w6 q1 ]- r /* USER CODE END WHILE */ % Q1 Z$ j- W" X2 k /* USER CODE BEGIN 3 */ if(delay_10s_flag==1) //10S {6 B* S4 l- Q& S2 E6 F MC_StopMotor1(); //停止电机运行2 x3 P; L$ J" M1 D9 d: T, d# A5 s delay_10s_flag=0; }) S' H) T. c2 ?* E if(delay_5s_flag==1) //5S6 d/ e2 ^( N0 t: g/ h0 ?& a {! V. c% }8 }. b; _ MC_StartMotor1();# `) o9 k i9 Y, h' r; m' r. { delay_5s_flag=0;3 Q, D3 o+ G- `3 Y9 y5 S } # E5 a: Y2 T6 A& T, E$ V, x9 n5 z / m9 ~) C/ E9 P5 g0 D; ~ } /* USER CODE END 3 */ a$ j+ i1 ~$ [5 k) f% _! p- x - r! ]# @! T& l2 V& M# x 3 |4 L# n6 P9 D$ l/ H }, m& G+ y. ^; ]) t5 D6 T # i9 M( K& P" F+ f$ `8 U /* USER CODE END 0 */ 3 {' X/ Z" {1 r+ L e2 X 9 J, s, _3 \4 I 9 x @: N& f& d7 }" J2 l# G7 v4 g+ F " F8 M. o# o% t1 C& \7 |3 I8 H stm32f30x_mc_it.c 程序里面添加内容: 在滴答定时中断程序里面调用定义的函数5 u) G" {1 G' g0 [. K void SysTick_Handler(void) {( z/ X. a" z1 n6 S #ifdef MC_HAL_IS_USED0 G3 ]( l$ E( B" S( A+ C+ _3 T. }5 {1 C0 Z static uint8_t SystickDividerCounter = SYSTICK_DIVIDER;9 @- R* Z7 V" y6 X5 i /* USER CODE BEGIN SysTick_IRQn 0 */7 e/ a9 E& B/ Q: @ . T5 J) C! H0 b( y, O /* USER CODE END SysTick_IRQn 0 */ if (SystickDividerCounter == SYSTICK_DIVIDER) { {" w! n9 s3 \& A% _% E HAL_IncTick(); HAL_SYSTICK_IRQHandler();: H" j5 z1 Z1 }; s6 a7 q, f9 P SystickDividerCounter = 0;3 r9 e) X" |3 {6 t% }! g8 e: H } SystickDividerCounter ++; #endif /* MC_HAL_IS_USED */! p& j. D& c8 q6 E8 D, F / t& }; N7 B" [( C! G5 c /* USER CODE BEGIN SysTick_IRQn 1 */ /* USER CODE END SysTick_IRQn 1 */7 I/ J; D( p" ^, [+ O& a0 h MC_RunMotorControlTasks();2 v% D! W" v: Z /* USER CODE BEGIN SysTick_IRQn 2 */+ c! L2 Y+ g( q) a5 a8 T/ R) B Delay_Handler(); /* USER CODE END SysTick_IRQn 2 */3 q0 f+ W6 A3 k; D7 ~9 ` }: v$ x/ Y {$ ~! h% A 4 k5 Y0 |7 `0 N7 h8 @0 k0 R % _! _' A$ j Q) v- A1 b9 c( y / L1 G- T6 M, T, h8 X1 C2 ~. S 3、测试波形:- s% Y. @* C0 j8 f 在程序定义PC9为输出,观察滴答定时器的定时时间,滴答定时器的时间周期为0.5us ,程序处理后变成1s定时周期: 监控电机运行的图片: / t9 h1 ~; n g- L7 w3 o+ R+ ^3 G ' U: U1 }! R* c) R ; O$ K8 T+ j5 y: U2 j0 k + s. @" C. A2 z5 {: S: \. z C 6 M3 u7 M- \# ~0 @$ v0 F6 A 6 Y' S5 b6 c/ s0 ?9 ^* x; t |
共同学习