Bootstrap

【STM32嵌入式系统设计与开发---拓展】——1_12中断

中断是什么?

中断(Interrupt)是系统机制,允许设备或外部事件暂时打断正在执行的程序,并快速处理紧急任务。中断的主要作用是提高系统的响应速度和效率。
在这里插入图片描述
参考

EXTI是什么?

EXTI(External Interrupt/Event Controller)是STM32用于管理和处理外部引脚中断和事件的控制器。

NVIC是什么?(嵌套向量中断控制器)

NVIC(Nested Vectored Interrupt Controller)是STM32微控制器中的嵌套向量中断控制器,负责管理和优先级排序所有的中断请求,允许中断嵌套执行。

中断优先级是怎么样的?

中断具有优先级高低之分,两个中断同时触发,则优先响应高优先级中断,再响应低优先级中断。
在这里插入图片描述

编写实现中断功能代码的过程是怎样的?

1、先写一个主函数循环执行的一个程序

	while(1)
	{	 								
    /* LED1灯300ms闪烁 */	
      delay_ms(800);
			LED1 =! LED1;               //LED取反
	}	

2、添加中断源文件所需的头文件

#include "stm32f10x_gpio.h"    // 包含针对 STM32F10x 系列的 GPIO 头文件,提供 GPIO 配置的函数和定义
#include "stm32f10x_rcc.h"     // 包含针对 STM32F10x 系列的 RCC 头文件,提供时钟配置的函数和定义
#include "stm32f10x_exti.h"    // 包含针对 STM32F10x 系列的 EXTI 头文件,提供外部中断配置的函数和定义
#include "misc.h"              // 包含杂项功能头文件,通常包含跨不同外设使用的定义和函数

#include "./delay/delay.h"     // 包含自定义库中的延迟函数头文件,用于创建程序执行延迟
#include "./exit/exit.h"       // 包含自定义库中的外部中断函数头文件,用于配置和处理外部中断
#include "SingleKey.h"         // 包含 SingleKey 模块的头文件,该模块可能提供从单个按键读取输入的函数
#include "led.h"               // 包含 LED 模块的头文件,该模块可能提供控制 LED 的函数

3、外部中断初始化

void EXTIX_Init(void)
{
 	EXTI_InitTypeDef EXTI_InitStructure;                        // 定义外部中断配置结构体
 	NVIC_InitTypeDef NVIC_InitStructure;                        // 定义中断控制器配置结构体
	
  /*时钟使能*/
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);	      // 使能 AFIO 时钟,用于配置外部中断的映射
	
  /*中断线配置*/   
  GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource4); // 配置外部中断线,将 PC4 映射到外部中断4
  EXTI_InitStructure.EXTI_Line = EXTI_Line4;	                // 设置外部中断线为 EXTI4
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;	        // 设置外部中断模式为中断模式
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;     // 设置触发方式为下降沿触发
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;                   // 使能外部中断线
  EXTI_Init(&EXTI_InitStructure);	 	                          // 初始化外部中断配置
	
	/*NVIC配置*/
  NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQn;	          // 设置中断向量为外部中断4
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;// 设置抢占优先级为2
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x03;     	// 设置子优先级为3
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;	            // 使能外部中断4
  NVIC_Init(&NVIC_InitStructure);                             // 初始化中断控制器配置
	
	LED2 = 0;                                                   // 初始化LED2为关闭
}

4、在写外部中断服务程序

void EXTI4_IRQHandler(void)
{
	delay_ms(10);//消抖
	if(DK1==0)				 
		LED2 =!LED2;	
	EXTI_ClearITPendingBit(EXTI_Line4); //清除LINE4上的中断标志位  
}

5、头文件完善

代码分析

时钟配置

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);	      // 使能 AFIO 时钟,用于配置外部中断的映射

外部中断映射机制使得 STM32 能够在有限的中断线资源下,有效地处理多个 GPIO 引脚的中断请求,提高了系统的灵活性和可扩展性

外部中断

typedef struct
{
  uint32_t EXTI_Line;               /*!< 指定要启用或禁用的 EXTI 线路。 */

  EXTIMode_TypeDef EXTI_Mode;       /*!< 指定 EXTI 线路的模式。 */

  EXTITrigger_TypeDef EXTI_Trigger; /*!< 指定 EXTI 线路的触发信号有效边沿。 */

  FunctionalState EXTI_LineCmd;     /*!< 指定所选 EXTI 线路的新状态。*/ 
}EXTI_InitTypeDef;

EXTI_Mode

typedef enum
{
  EXTI_Trigger_Rising = 0x08,  /*!< 上升沿触发 */
  EXTI_Trigger_Falling = 0x0C,  /*!< 下降沿触发 */  
  EXTI_Trigger_Rising_Falling = 0x10  /*!< 上升沿和下降沿都触发 */
}EXTITrigger_TypeDef;

抢占优先级和子优先级

在这里插入图片描述

外部中断服务函数

void EXTI4_IRQHandler(void)
{
	delay_ms(10);//消抖
	if(DK1==0)				 
		LED2 =!LED2;	
	EXTI_ClearITPendingBit(EXTI_Line4); //清除LINE4上的中断标志位  
}

EXTI4_IRQHandler
在这里插入图片描述

电机有哪些?

在这里插入图片描述

控制电机有哪些方式?

在这里插入图片描述

开环控制

电机的开环控制是一种直接的控制策略。
控制信号直接发送至电机驱动器以指定运行状态,但系统不会对电机实际输出状态实时监测和反馈。
由于电机参数变化、外部负载波动和电源电压不稳定等因素,实际运行状态可能偏离预期,且系统无法自动调整。其优点是结构简单、易于实现、成本低,常见于对精度和稳定性要求不高的场景。在高精度要求场合则难以满足需求

/*********************************************************************
 @Function  : 步进电机转向控制/开环控制
 @Parameter : Status : 运转控制
										 1 : 顺转
                     2 : 反转
 @Return    : N/A
**********************************************************************/
void StepMotorControl(uint8_t Status) // 控制步进电机的转向
{
	   uint8_t i = 0, j = 0; // 定义循环变量i和j
    switch(Status)
    {
        case 1:  // 顺转
            for(j = 0; j < 12; j++)         // 外层循环,控制电机转动的周期
            {
                for(i = 0; i < 8; i++)      // 内层循环,执行顺转的步进序列
                {
                    SetBit(FFW[i] & 0x1f);  // 设置电机控制引脚,FFW为顺转步进序列数组
                    delay_ms(1);            // 延迟2毫秒,控制步进速度
                }
            }       
            break;
        case 2:  // 反转
            for(j = 0; j < 12; j++)        // 外层循环,控制电机转动的周期
            {
                for(i = 0; i < 8; i++)     // 内层循环,执行反转的步进序列
                {
                    SetBit(FFZ[i] & 0x1f); // 设置电机控制引脚,FFZ为反转步进序列数组
                    delay_ms(2);           // 延迟2毫秒,控制步进速度
                }
            }       
            break;
        default: 
            SetBit(0);                     // 停止,关闭所有电机控制引脚
            break;
    }   
}

闭环控制

电机的闭环控制是一种更为精确和稳定的控制方式。
在闭环控制系统中,通过传感器实时监测电机的实际运行状态,如转速、位置等,并将这些信息反馈给控制器。控制器将实际值与设定值进行比较,计算出偏差,然后根据偏差调整控制信号,使电机的实际运行状态尽可能接近设定值。

PID 常用于闭环控制系统中。在闭环控制中,通过反馈测量实际输出值与期望输出值的偏差,PID 控制器根据此偏差计算出控制量,对系统进行调节,以使系统的输出尽可能接近期望值

PWM脉宽控制

电机的脉宽控制(PWM)是一种常用的电机调速控制方式。
其原理是通过快速切换电源的通断,改变在一个周期内通电时间的占空比,从而控制电机的平均电压。占空比越大,平均电压越高,电机转速就越快;反之,占空比越小,平均电压越低,电机转速越慢。

矢量控制

电机的矢量控制是一种先进的高性能控制方法。
它将交流电机的定子电流分解为产生磁场的励磁电流和产生转矩的转矩电流,并分别进行控制。
通过坐标变换,将交流电机等效为直流电机进行控制,实现对电机磁通和转矩的解耦控制。
例如在电动汽车驱动中,矢量控制能精确控制电机的输出转矩,实现快速响应和高效运行。
矢量控制具有动态性能好、精度高、调速范围宽等优点,但算法复杂,计算量大,对控制器性能要求较高。

;