为了熟悉定时器定时器和ADC
用STM32F407DIS做了一个简单的工程:
通过高级定时器TIM1溢出更新时间作为触发输出信号(TRGO),触发TIM8开始计数;
同时TIM1的通道1、2、3以及分别的互补通道输出6路PWM波用于控制三相电机;
TIM1的通道4用于触发ADC1的注入通道;
TIM8的通道1用于触发三个ADC的的规则通道;
TIM8的通道2用于触发ADC2的注入通道;
最后采样结果通过DMA传输到数组内保存起来;
为此,绘制了程序框图:
由框图来看工程更加清晰,更便于理解;
接下来配置工程,实现该任务:
首先配置定时器:
1 TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; 2 TIM_OCInitTypeDef TIM_OCInitStructure;3 TIM_BDTRInitTypeDef TIM_BDTRInitStructure; 4 GPIO_InitTypeDef GPIO_InitStructure;
开启时钟以及基础设置
1 // TIM1 clock enable 2 RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); 3 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOE, ENABLE); 4 5 // Time Base configuration 6 TIM_TimeBaseStructure.TIM_Prescaler = 0; //时钟频率除数的预分频值 7 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; 8 TIM_TimeBaseStructure.TIM_Period = 4200; //ARR 9 TIM_TimeBaseStructure.TIM_ClockDivision = 0; //时钟分割 10 TIM_TimeBaseStructure.TIM_RepetitionCounter = 0; 11 TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
通道设置
1 // Channel 1, 2 and 3 Configuration in PWM mode 2 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; 3 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; 4 TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable; 5 TIM_OCInitStructure.TIM_Pulse = TIM1->ARR / 2; //待装入捕获比较寄存器的值 5000 6 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出比较极性 高 7 TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High; //互补输出极性 高 8 TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set; //空闲状态期间输出比较引脚状态 9 TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Set; 10 11 TIM_OC1Init(TIM1, &TIM_OCInitStructure); 12 TIM_OC2Init(TIM1, &TIM_OCInitStructure); 13 TIM_OC3Init(TIM1, &TIM_OCInitStructure); 14 TIM_OC4Init(TIM1, &TIM_OCInitStructure); 15 16 TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable); 17 TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable); 18 TIM_OC3PreloadConfig(TIM1, TIM_OCPreload_Enable); 19 TIM_OC4PreloadConfig(TIM1, TIM_OCPreload_Enable);
死区设置
1 TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable; 2 TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable; 3 TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_OFF; 4 TIM_BDTRInitStructure.TIM_DeadTime = 60; // 60个周期时间 5 TIM_BDTRInitStructure.TIM_Break = TIM_Break_Disable; 6 TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_High; 7 TIM_BDTRInitStructure.TIM_