STM32F405电机控制底层的时序逻辑

一、PWM波形

基于STM32CubeMX配置TIM输出互补六路PWM配置的工程
W相的配置:周期16khz、占空比20%
V相的配置: 周期16khz、占空比40%
U相的配置: 周期16khz、占空比60%

  MX_TIM1_Init();
  __HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1,25); 
  __HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_2,50);
  __HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_3,75);
  
  HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1);  //黑色W相
  HAL_TIMEx_PWMN_Start(&htim1, TIM_CHANNEL_1);  
  HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_2);  //蓝色V相
  HAL_TIMEx_PWMN_Start(&htim1, TIM_CHANNEL_2); 
  HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_3);  //黄色U相
  HAL_TIMEx_PWMN_Start(&htim1, TIM_CHANNEL_3);
  
  htim1.Instance->CCR4 = 1; 
  HAL_TIM_PWM_Start_IT(&htim1, TIM_CHANNEL_4);

通道1采集U相下桥PWM波形
在这里插入图片描述

二、GPIO翻转波形

定时器1的通道1、通道2、通道3输出互补六路PWM
配置定时器1的通道4在PWM下桥中点处中断入口的GPIO翻转波形

void TIM1_CC_IRQHandler(void)
{    
    HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_11);   
    HAL_TIM_IRQHandler(&htim1);     
}

在这里插入图片描述

三、ADC转换完成

基于双ADC+注入模式采集配置的工程用2个ADC分别采集了4个模拟量
ADC的触发事件为定时器1通道4,所以通道4事件发生后,开始ADC的采集
用通道3采集ADC转换完成中断的GPIO翻转波形
由于ADC是在TIM之后发生的:配置的ADC中断优先级大于TIM1中断优先级

void ADC_IRQHandler(void)
{
  HAL_ADC_IRQHandler(&hadc1);
  HAL_ADC_IRQHandler(&hadc2);
  HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_10);
}

在这里插入图片描述
GPIO翻转的同时,ADC进行4路模拟量的采集
代码在TIM中断中

void TIM1_CC_IRQHandler(void)
{     
    HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_11);
    
    ADCValue[0] = HAL_ADCEx_InjectedGetValue(&hadc1,ADC_INJECTED_RANK_1) * 3.3;
    ADCValue[0] = ADCValue[0]/4096.0;     
    ADCValue[1] = HAL_ADCEx_InjectedGetValue(&hadc1,ADC_INJECTED_RANK_2) * 3.3;
    ADCValue[1] = ADCValue[1]/4096.0; 
    ADCT = (ADCValue[1]-0.76)/0.0025 + 25;  

    ADCValue[2] = HAL_ADCEx_InjectedGetValue(&hadc2,ADC_INJECTED_RANK_1) * 3.3;
    ADCValue[2] = ADCValue[2]/4096.0;     
    ADCValue[3] = HAL_ADCEx_InjectedGetValue(&hadc2,ADC_INJECTED_RANK_2) * 3.3;
    ADCValue[3] = ADCValue[3]/4096.0;
          
    NTC_R_Value = 1000* HAL_ADCEx_InjectedGetValue(&hadc1,ADC_INJECTED_RANK_2)/(4096-  HAL_ADCEx_InjectedGetValue(&hadc1,ADC_INJECTED_RANK_2));
    device_temperature = Get_NTC_Temperature(NTC_R_Value);
    vbus_voltage=(HAL_ADCEx_InjectedGetValue(&hadc2,ADC_INJECTED_RANK_2)*19)/100;
         
    __HAL_ADC_ENABLE_IT(&hadc1,ADC_IT_JEOC); 
    __HAL_ADC_ENABLE_IT(&hadc2,ADC_IT_JEOC);
    HAL_ADC_Start_IT(&hadc1);
    HAL_ADC_Start_IT(&hadc2);
    
    HAL_TIM_IRQHandler(&htim1);     
}

在这里插入图片描述

四、485A波形

基于UART与电脑+串口调试助手实现多摩川编码器透传功能配置的工程
编码器在ADC触发开始采集的时候开始发生位置请求,并通过通道4采集485A的波形
由于UART是在ADC之后发生的:配置的UART中断优先级大于ADC中断优先级

void TIM1_CC_IRQHandler(void)
{     
    HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_11);
    ADCValue[0] = HAL_ADCEx_InjectedGetValue(&hadc1,ADC_INJECTED_RANK_1) * 3.3;
    ADCValue[0] = ADCValue[0]/4096.0;     
    ADCValue[1] = HAL_ADCEx_InjectedGetValue(&hadc1,ADC_INJECTED_RANK_2) * 3.3;
    ADCValue[1] = ADCValue[1]/4096.0; 
    ADCT = (ADCValue[1]-0.76)/0.0025 + 25;  

    ADCValue[2] = HAL_ADCEx_InjectedGetValue(&hadc2,ADC_INJECTED_RANK_1) * 3.3;
    ADCValue[2] = ADCValue[2]/4096.0;     
    ADCValue[3] = HAL_ADCEx_InjectedGetValue(&hadc2,ADC_INJECTED_RANK_2) * 3.3;
    ADCValue[3] = ADCValue[3]/4096.0;
       
    NTC_R_Value = 1000* HAL_ADCEx_InjectedGetValue(&hadc1,ADC_INJECTED_RANK_2)/(4096-HAL_ADCEx_InjectedGetValue(&hadc1,ADC_INJECTED_RANK_2));
	device_temperature = Get_NTC_Temperature(NTC_R_Value);
    vbus_voltage=(HAL_ADCEx_InjectedGetValue(&hadc2,ADC_INJECTED_RANK_2)*19)/100;
         
    __HAL_ADC_ENABLE_IT(&hadc1,ADC_IT_JEOC); 
    __HAL_ADC_ENABLE_IT(&hadc2,ADC_IT_JEOC);
    HAL_ADC_Start_IT(&hadc1);
    HAL_ADC_Start_IT(&hadc2);

       if (u2_txbuff[0] == 0X02)
      {
        HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_SET);
        HAL_UART_Transmit_DMA(&huart3,&Instruction_value1,1);
         if(Range_value_1>0xCC)
         {
            Range_value_1=0;
            Range_value_1++;
         }else
         {
            Range_value_1++;
         }   
      }    
    HAL_TIM_IRQHandler(&htim1);     
}

在这里插入图片描述

在这里插入图片描述

五、中断优先级配置

UART+DMA:(0,2)
ADC:(1,0)
TIM1:(1,1)
TIM2~5:(2,1)

    HAL_NVIC_SetPriority(DMA1_Stream1_IRQn, 0, 2);
    HAL_NVIC_EnableIRQ(DMA1_Stream1_IRQn);
    HAL_NVIC_SetPriority(DMA1_Stream6_IRQn, 0, 2);
    HAL_NVIC_EnableIRQ(DMA1_Stream6_IRQn);
    HAL_NVIC_SetPriority(DMA1_Stream3_IRQn, 0, 2);
    HAL_NVIC_EnableIRQ(DMA1_Stream3_IRQn);
    HAL_NVIC_SetPriority(DMA1_Stream5_IRQn, 0, 2);
    HAL_NVIC_EnableIRQ(DMA1_Stream5_IRQn); 

    HAL_NVIC_SetPriority(USART3_IRQn,0, 2);
    HAL_NVIC_EnableIRQ(USART3_IRQn);
    HAL_NVIC_SetPriority(USART2_IRQn, 0,2);  
    HAL_NVIC_EnableIRQ(USART2_IRQn);  
    
    HAL_NVIC_SetPriority(ADC_IRQn, 1, 0);
    HAL_NVIC_EnableIRQ(ADC_IRQn);
    HAL_NVIC_SetPriority(ADC_IRQn, 1,0 );
    HAL_NVIC_EnableIRQ(ADC_IRQn);
    
    HAL_NVIC_SetPriority(TIM1_CC_IRQn, 1, 1);        
    HAL_NVIC_EnableIRQ(TIM1_CC_IRQn);
    HAL_NVIC_SetPriority(TIM2_IRQn, 2, 1);
    HAL_NVIC_EnableIRQ(TIM2_IRQn);
    HAL_NVIC_SetPriority(TIM3_IRQn, 2, 1);
    HAL_NVIC_EnableIRQ(TIM3_IRQn);
    HAL_NVIC_SetPriority(TIM4_IRQn, 2, 1);
    HAL_NVIC_EnableIRQ(TIM4_IRQn); 
    HAL_NVIC_SetPriority(TIM5_IRQn, 2, 1);
    HAL_NVIC_EnableIRQ(TIM5_IRQn); 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值