培训手册里 实验2:基于MC SDK5.0 API速度控制与电机启动停止。1、实验2内容:. Z, e3 y+ }9 y3 `
# P' d0 \! j x0 A% m' f% ~ 6 y9 F8 R7 z' w5 n# b 2、程序代码,在上篇实现的代码的基础上,修改代码如下:! O# L* i) _- u# S2 s9 Z+ u1 h main.c程序里面添加内容 //----------------------------- //定义变量- ] a' m% w8 }" m1 q /* USER CODE BEGIN PV */1 E7 I, i: U; M% b. f /* Private variables ---------------------------------------------------------*/) y) L0 P& k2 H1 j static uint32_t delay_cnt=0; //延时计数 # f5 b% z$ `+ p static uint32_t delay_cnt1=0; 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 */ //函数定义2 X& t$ q. l/ d$ T( p /* USER CODE BEGIN 0 */ //定时器处理' K2 X& [' o2 ~" F void Delay_Handler(void) {4 q2 K2 P% |5 |6 m7 K delay_cnt++; if(delay_cnt>2000) //1s计时 { delay_cnt=0; HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_9); //定义示波器看时引脚. L g5 V' W8 }7 `$ n2 H0 E& g2 e //----------------------------------------8 M. ]' j9 ? [% E) l if(delay_start_flag==0x30) //启动10s计时 {' v" k" x7 r8 T2 J8 R V6 c delay_cnt1++;2 E5 J5 i6 B6 \- s+ V3 F1 u. ^; F1 j if(delay_cnt1>9) //10S4 ]$ V- {+ A& _5 S; D1 \9 ]& ` {0 i' L: J3 {2 f( Y delay_cnt1=0;, C: T: e: T6 r7 x+ Y( x delay_start_flag=0x20; : W- C V% \4 D. I delay_10s_flag=1; //10S时间到标志位' H5 E6 \* W' V1 g/ U0 {" x } 6 t/ ^& c7 p3 A' N0 N1 _+ W8 U } else if(delay_start_flag==0x20) //启动5s计时' F2 x& {2 o( }5 [8 Q$ s( w { delay_cnt1++; if(delay_cnt1>4) //5S {( }- E9 N* @& w5 s delay_cnt1=0; delay_start_flag=0x30; t: S$ W$ I- g0 ?; u4 S1 H delay_5s_flag=1; //5S时间到标志位 } } , x. I1 }9 r8 i3 n1 c w5 b } }) _) D& g2 d) F. f1 c* W; C0 h 5 _4 u+ _) h: g# }( Y0 Z. ~5 z. y int main(void) {9 j0 H& m9 M% s- O! ?. o" z /* USER CODE BEGIN 1 */, G$ ?- o/ n0 x n /* USER CODE END 1 */# r( P$ K. ]+ I: Z0 A+ g / j* E4 P8 w/ n ] /* MCU Configuration----------------------------------------------------------*/6 M% }8 z. |$ H9 e /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); 1 ^1 P0 i4 l( z/ K: ]) u /* USER CODE BEGIN Init */ T+ p( n2 ^3 Y! j; X! F / o& J$ G1 s7 r) { /* USER CODE END Init */) I4 \* G5 f# I+ M7 V ' V& l( o& x T$ | /* Configure the system clock */ SystemClock_Config(); B* j( T9 O7 w, N /* USER CODE BEGIN SysInit */ & S8 s! p& n, B/ R- X3 l, e 5 T( ~9 w* [: F0 ] /* USER CODE END SysInit */ # Q1 @9 ~+ O% Q% d" [ /* Initialize all configured peripherals */# j9 O9 m/ }( y% e8 j' ^ MX_GPIO_Init();0 c) N. Y; |7 @, \1 b6 `( Q/ u3 \8 c MX_ADC1_Init(); MX_DAC_Init();) E6 L" x2 v5 M/ y MX_TIM1_Init(); MX_USART2_UART_Init();0 s U, b/ h: D( ?& C" z4 H# } MX_MotorControl_Init();* W+ Y+ H3 S- S) @0 e 1 S$ S; S0 ~2 ]( ~. Z 7 L+ z, R" K! X- @/ i /* Initialize interrupts */1 T! A' V3 @8 x- w \ MX_NVIC_Init(); /* USER CODE BEGIN 2 */ MC_StartMotor1(); //启动电机) e3 A& ]; c2 p MC_ProgramSpeedRampMotor1(3000/6,1000); //1s内加速到3000RPM$ `) T7 b/ L9 D8 V6 v) b% ]1 c" o ) \" ?$ U! B: c/ g4 } /* USER CODE END 2 */ 4 ]/ s X7 O5 a, |: k& J /* Infinite loop */4 r3 Q( @7 g8 F: @) f' c /* USER CODE BEGIN WHILE */ while (1) {1 c# l' _; G; B /* USER CODE END WHILE */ 3 p+ C ~1 c9 u' W, |$ s * ^( C' T& z, @$ C /* USER CODE BEGIN 3 */& E# M5 ~! P$ _% U" ~0 i if(delay_10s_flag==1) //10S* E* f* M/ A! { { MC_StopMotor1(); //停止电机运行 delay_10s_flag=0; } if(delay_5s_flag==1) //5S {3 `1 _' Z1 S* w0 H MC_StartMotor1();) ?0 i$ n6 v' t+ b delay_5s_flag=0; }7 ?1 M0 N {& M; R & K9 q( D2 N5 d( H' h + F' ?7 H0 _- E7 R } /* USER CODE END 3 */1 r/ o" A( I/ i + ^9 L) F5 m! s. } } . N- ?/ W1 F o2 E# K. d 4 L9 p8 @1 k8 g8 |* q4 f 1 f6 ]/ c$ C8 y$ d( v /* USER CODE END 0 */+ P, Y" }' X8 X( z# H2 K 0 I3 C4 p9 w$ H stm32f30x_mc_it.c 程序里面添加内容: 在滴答定时中断程序里面调用定义的函数6 V* D, |" |, M" v% ~ void SysTick_Handler(void)7 T! k8 A# d9 ^( L4 N; H: L5 K {/ q7 M) p" T1 E6 D' R3 G x #ifdef MC_HAL_IS_USED static uint8_t SystickDividerCounter = SYSTICK_DIVIDER; /* USER CODE BEGIN SysTick_IRQn 0 */# Q* y, j9 n/ M J, m 6 x, }9 \* m3 l2 E$ S- e% q 8 r$ U I! i: L6 Q' n /* USER CODE END SysTick_IRQn 0 */ if (SystickDividerCounter == SYSTICK_DIVIDER)" t- f, s( B! U! a { HAL_IncTick();3 I% ~+ B8 Y) n( J" u! k5 s HAL_SYSTICK_IRQHandler(); SystickDividerCounter = 0; }+ R$ p' t8 }! b+ c$ x SystickDividerCounter ++; #endif /* MC_HAL_IS_USED */$ k8 Z. h: U- F3 y! \9 i' O! q$ U, I" X; h 2 o6 j% H% W5 l * G5 l" H* o l# a2 Z! m" | /* USER CODE BEGIN SysTick_IRQn 1 */ /* USER CODE END SysTick_IRQn 1 */ MC_RunMotorControlTasks();& T& o& g! @( i; ~1 k /* USER CODE BEGIN SysTick_IRQn 2 */) f- V) M% L) k Delay_Handler(); /* USER CODE END SysTick_IRQn 2 */ }9 S3 W# i& A/ O6 @: j; R4 |& s # [$ @: e8 B2 b 3、测试波形:+ Y! J. U& {! |; f8 y; @- ? 在程序定义PC9为输出,观察滴答定时器的定时时间,滴答定时器的时间周期为0.5us ,程序处理后变成1s定时周期:
" l2 q. E S( U p$ l7 P ; k7 @$ |6 s9 U# M 监控电机运行的图片:
3 j1 q" v! Y- o ; A) J, y/ j! P$ d4 D & f3 h: ~' ?! M* Q: L1 X1 V " Q5 {1 [) k* s9 L' B. n) l$ { ( M0 `1 T& i, K' `0 M1 I! d , l! P5 \3 h* T) o, r) O : o5 N9 o7 S4 h g9 T K |
微信公众号
手机版
共同学习