培训手册里 实验2:基于MC SDK5.0 API速度控制与电机启动停止。1、实验2内容:
2、程序代码,在上篇实现的代码的基础上,修改代码如下:% w( z/ i$ x1 W main.c程序里面添加内容 //-----------------------------; c0 t) a) v5 b //定义变量: i' W, K2 J) W0 J! X3 } /* USER CODE BEGIN PV */" Q) v9 b4 U7 {# t; d /* Private variables ---------------------------------------------------------*/ static uint32_t delay_cnt=0; //延时计数 # S6 R2 K1 B4 q0 P& n. N static uint32_t delay_cnt1=0;& V" u% Y+ A; ?& g# g1 R static uint8_t delay_start_flag=0x30; //延时启动标志位 static uint8_t delay_5s_flag=0; //5s时间到标志位 static uint8_t delay_10s_flag=0; //10s时间到标志位 /* USER CODE END PV */ //函数定义 /* USER CODE BEGIN 0 */ S+ a4 J: v3 {% H. j //定时器处理) D( S- ]( T) z6 b6 w4 d4 K O6 e void Delay_Handler(void) { delay_cnt++;# e- B# O3 N& B; x; ~ if(delay_cnt>2000) //1s计时 { delay_cnt=0;1 i# v) G" V) A HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_9); //定义示波器看时引脚 //---------------------------------------- if(delay_start_flag==0x30) //启动10s计时7 K% H% ?4 F3 H9 V( i1 U) ^: u) p {. h( z8 J0 J- m! h: b delay_cnt1++; if(delay_cnt1>9) //10S {( q4 k1 \+ S, ~- F delay_cnt1=0;; _7 ]# S- h* p- c3 f delay_start_flag=0x20; & H* m6 D6 i" {1 k7 C# ` delay_10s_flag=1; //10S时间到标志位 } ) v! n; I, _% ]& L. U u0 T }) D( y) }9 o' x+ n else if(delay_start_flag==0x20) //启动5s计时$ U" k- x- M$ J8 B! }3 O { delay_cnt1++; if(delay_cnt1>4) //5S { delay_cnt1=0;7 _/ S g- c& z- C' |# ^1 { delay_start_flag=0x30;/ }9 @5 Z/ K& I$ p" I delay_5s_flag=1; //5S时间到标志位 } } }# ^7 B2 s, h- m& [: Y u2 _ } # Y8 j" ~% x5 h6 c, k4 T2 ] l, V8 {8 f int main(void)+ n. S- O& ?3 p- i% ` {+ x9 c- A$ _8 H3 L7 k" s' c /* USER CODE BEGIN 1 */" B+ {- E1 M: z$ I( e; n /* USER CODE END 1 */6 M+ `# \1 I. |9 t: ?+ I 8 c+ T) R8 k2 i, S/ X/ L0 e /* MCU Configuration----------------------------------------------------------*/4 K6 v+ D& }- M7 t & \& ]9 q' _8 \8 G- |5 q" Q: { $ ?; g2 X# ~; g* @+ G6 v: _3 Z /* Reset of all peripherals, Initializes the Flash interface and the Systick. *// |7 G9 H1 L1 y% i2 v HAL_Init(); + v5 X W% z r" U /* USER CODE BEGIN Init */ | W7 h6 x% [- d; o% }/ t /* USER CODE END Init */5 E, }- D( U- s, S9 L1 i6 ~" l /* Configure the system clock */ SystemClock_Config(); & [) {' d$ W* v# T1 t /* USER CODE BEGIN SysInit */! C0 T; l$ J( K& c! E, l /* USER CODE END SysInit */ 1 {* b) N f: P/ d /* Initialize all configured peripherals */ MX_GPIO_Init(); MX_ADC1_Init(); MX_DAC_Init(); MX_TIM1_Init(); MX_USART2_UART_Init();+ o6 N) N' S1 @ MX_MotorControl_Init(); 9 L+ U' G- |2 Z1 ` /* Initialize interrupts */* M, v% f0 z3 X- w MX_NVIC_Init(); /* USER CODE BEGIN 2 */ MC_StartMotor1(); //启动电机0 o' A V' u" S( T4 T* ?+ v1 T MC_ProgramSpeedRampMotor1(3000/6,1000); //1s内加速到3000RPM( o3 {- V4 k$ r' f8 C5 z& b " ]: z, p' J' U9 C /* USER CODE END 2 */$ F2 @, e$ g5 B- j; p % H2 n8 V- ~ \2 X0 ~7 q /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) {+ L9 j' X# q: {9 A" e . [ Q5 Y1 n/ v! R% k i9 d, B$ i9 p+ e0 u$ {8 _ /* USER CODE END WHILE */ % h# ?$ l' R7 r% P& F4 P /* USER CODE BEGIN 3 */ if(delay_10s_flag==1) //10S {( d2 D5 |) n# Q! j$ z* F MC_StopMotor1(); //停止电机运行7 u/ k5 |3 T+ T( F6 M delay_10s_flag=0;5 z) b: o; [, N$ j6 I }% U: }% o) W% [. { if(delay_5s_flag==1) //5S# B. o8 m6 N8 | x; k: C6 p& R( G {6 k. S: Y" v' k Y, W MC_StartMotor1(); delay_5s_flag=0;6 z, n% {9 Q! ]8 b* F; q }* x% U J3 U7 f+ [& \+ C } /* USER CODE END 3 */8 C) t" M0 P/ x4 D0 T : q& ^, k% ?" L$ h( v* T }1 R$ t. F5 M) @" O9 x + W4 Z5 h" E# |# o) O( l: y /* USER CODE END 0 */# z( |8 }7 s) a- N6 \- ^* z - |$ Q0 h" m# Z# S* X$ ] stm32f30x_mc_it.c 程序里面添加内容:3 p; \8 A# M# J: b% @ 在滴答定时中断程序里面调用定义的函数 void SysTick_Handler(void) { #ifdef MC_HAL_IS_USED static uint8_t SystickDividerCounter = SYSTICK_DIVIDER;/ p8 n4 w6 c6 e5 k1 h" { /* USER CODE BEGIN SysTick_IRQn 0 */ 0 }( b6 q$ [5 _ J! W0 I; t m /* USER CODE END SysTick_IRQn 0 */5 t2 a% h K4 x* `- K8 i if (SystickDividerCounter == SYSTICK_DIVIDER)- n2 u1 `0 m" @% \5 ~ { HAL_IncTick(); HAL_SYSTICK_IRQHandler(); SystickDividerCounter = 0;6 i* F% ~1 P1 D }9 Y: |- ^5 Q- G6 I2 b0 @ SystickDividerCounter ++; #endif /* MC_HAL_IS_USED */8 j. e3 C! ~ g) S% e5 C2 S ) M* U, h/ W8 p4 v /* USER CODE BEGIN SysTick_IRQn 1 */" j5 l# n7 x8 q/ t/ W" p& x8 X. i7 } /* USER CODE END SysTick_IRQn 1 */ MC_RunMotorControlTasks();1 ?! X: x% v7 ~* ?/ e( v: x /* USER CODE BEGIN SysTick_IRQn 2 *// C( ~- J" a; C9 J1 o Delay_Handler();. e' U6 m7 `, t. v% t. ` /* USER CODE END SysTick_IRQn 2 */ } , J, O0 y7 S) s/ m/ z' R9 }: ?9 J 4 }8 Q1 Z+ i. n" D& O # W% E5 v; P' n 3、测试波形:; I, S8 t$ F9 ~+ ` x: x: u 在程序定义PC9为输出,观察滴答定时器的定时时间,滴答定时器的时间周期为0.5us ,程序处理后变成1s定时周期:; C& z% B1 V) j
( `+ E, v5 B; `5 l 监控电机运行的图片:0 H. I5 a0 E, Q; G, T5 I
! i) n& n# K: m) i 0 Q6 |) Y9 }/ }1 B1 O! r1 y : b+ K/ t) n/ V0 J7 N+ Z0 G ' L" M1 u% t8 J* w5 C0 k* r4 ` 2 d% l r& Y" J/ R( c" t" C1 y + r9 U0 n( Q1 K5 Q2 D* P 4 P+ F3 | W9 i* u4 o* q , M. `! z9 H4 ~& p3 m5 u( t 5 I& s, `- u: o, n9 }1 ]/ J# |; H* i" { ) s7 R1 i* h! Q) q/ z# z& p0 P3 ~+ j/ z 6 k/ D/ t% C7 K! _ # [7 z# k! B/ I. W& D U# k# Y |
微信公众号
手机版
共同学习