一、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);