3.time.c程序
- #include "timer.h"
- /**************************
- * 函数名:GPIO_Config
- * 描述 :无
- * 输入 :无
- * 输出 :无
- * 调用 :主函数
- * 返回值:无
- ****************************/
- void GPIO_Config(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE); //使能IOA
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 | RCC_APB1Periph_TIM3, ENABLE); //使能TIM2,TIM3
-
- /* Timer2 Channel 1, PA0 */
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用输出
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOA, &GPIO_InitStructure);
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_11|GPIO_Pin_12;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //通用推挽输出模式
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //指定GPIO引脚可输出的最高频率为50MHZ
- GPIO_Init(GPIOA, &GPIO_InitStructure); //
- GPIO_ResetBits(GPIOA, GPIO_Pin_1);//指定引脚输出低电平,此时灯全灭,方向
- GPIO_ResetBits(GPIOA, GPIO_Pin_2);//指定引脚输出低电平,此时灯全灭 使能
- GPIO_SetBits(GPIOA, GPIO_Pin_11);//指定引脚输出低电平,此时灯全灭,方向
- GPIO_SetBits(GPIOA, GPIO_Pin_12);//指定引脚输出低电平,此时灯全灭 使能
-
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //通用推挽输出模式
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //指定GPIO引脚可输出的最高频率为50MHZ
- GPIO_Init(GPIOA, &GPIO_InitStructure); //
-
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //通用推挽输出模式
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //指定GPIO引脚可输出的最高频率为50MHZ
- GPIO_Init(GPIOB, &GPIO_InitStructure); //
- GPIO_ResetBits(GPIOB, GPIO_Pin_12);//指定引脚输出低电平,此时灯全灭 使能
-
- //GPIO_ResetBits GPIO_SetBits
- }
- //================================================================================
- /**************************
- * 函数名:TIM2_Master__TIM3_Slave_Configuration
- * 描述 :主从定时器配置
- * 输入 :电机转速speed,转角angle
- * 输出 :无
- * 调用 :主函数
- * 返回值:无
- ****************************/
- void TIM2_Master__TIM3_Slave_Configuration(u32 PulseFrequency, u32 pulse)
- {
- TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
- TIM_OCInitTypeDef TIM_OCInitStructure;
-
- u16 nPDTemp ;
- u16 pulse_number;
- float p=PulseFrequency;
- TIM_Cmd(TIM2, DISABLE);
- nPDTemp = (11.25/p); //TIM2重装值是11.25时1s转一圈(电机32细分下)
- pulse_number = (16.7778*pulse);//TIM3重装值是16.7778时转1°(电机32细分下)
-
- // 时基配置:配置PWM输出定时器——TIM2
- /* Time base configuration */
- TIM_TimeBaseStructure.TIM_Period = nPDTemp; //定时周期为nPDTemp
- TIM_TimeBaseStructure.TIM_Prescaler = 999; //预分频值1000,即f=72khz
- TIM_TimeBaseStructure.TIM_ClockDivision = 0; //时钟分频因子,会影响滤波器采样频率,与本实验无影响
- TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数模式
- TIM_TimeBaseStructure.TIM_RepetitionCounter = 0; //指定重复计数器值
- TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
-
- // 输出配置:配置PWM输出定时器——TIM2
- /* PWM1 Mode configuration: Channel1 */
- TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //TIM 脉冲宽度调制模式 1
- TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //高电平有效
- TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //使能输出
- TIM_OCInitStructure.TIM_Pulse = nPDTemp>>1;//50% //比较tim_ccr的值,输出脉冲发生跳变
- TIM_OC1Init(TIM2, &TIM_OCInitStructure); //初始化
- TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable); //使能 TIMx 在 CCR1 上的预装载寄存器
- TIM_ARRPreloadConfig(TIM2, ENABLE); //使能或者失能 TIMx 在 ARR 上的预装载寄存器
-
- // 时基配置:配置脉冲计数寄存器——TIM3
- TIM_TimeBaseStructure.TIM_Period = pulse_number; //0x1900是360°;//改变给电机的脉冲个数
- TIM_TimeBaseStructure.TIM_Prescaler = 0;
- TIM_TimeBaseStructure.TIM_ClockDivision = 0;
- TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
- TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
- TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
- // 输出配置:配置输出比较非主动模式定时器——TIM3
- // Output Compare Active Mode configuration: Channel1
- TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Inactive; //输出比较非主动模式,(匹配时设置输出引脚为无效 电平,当计数值为比较/捕获寄存器值相同时,强制输出为低电平)
- TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
- TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
- TIM_OCInitStructure.TIM_Pulse = 0xFFFF; // 这里的配置值意义不大
- TIM_OC1Init(TIM3, &TIM_OCInitStructure);
- // 配置TIM2为主定时器
- // Select the Master Slave Mode
- TIM_SelectMasterSlaveMode(TIM2, TIM_MasterSlaveMode_Enable); //设置 TIM2 主/从模式并使能
- // Master Mode selection
- TIM_SelectOutputTrigger(TIM2, TIM_TRGOSource_Update); //使用更新事件作为触发输出
-
- // 配置TIM3为从定时器
- // Slave Mode selection: TIM3
- TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Gated); //选择 TIM3为从模式 TIM_SlaveMode_Gated-当触发信号(TRGI)为高电平时计数器时钟使能
- TIM_SelectInputTrigger(TIM3, TIM_TS_ITR1); //选择 TIM3 输入触发源 TIM_TS_ITR1-TIM 内部触发 1
- TIM_ITRxExternalClockConfig(TIM3, TIM_TS_ITR1);//设置 TIM3 内部触发为外部时钟模式 TIM_TS_ITR1-TIM 内部触发 1
- TIM_ITConfig(TIM3, TIM_IT_CC1, ENABLE); //使能TIM3 TIM 捕获/比较 1 中断源
-
- TIM_Cmd(TIM2, ENABLE);
- TIM_Cmd(TIM3, ENABLE);
- }
- /****************************************************
- * 函数名:Output_Pulse
- * 描述 :无
- * 输入 :无
- * 输出 :无
- * 返回值:无
- ******************************************************/
- void Output_Pulse(u16 Num)
- {
- GPIO_ResetBits(GPIOA, GPIO_Pin_2);//指定引脚输出低电平,此时灯全灭 使能
- TIM3->CCR1 = Num;
- TIM3->CNT = 0;
- TIM_Cmd(TIM3, ENABLE);
- TIM_ITConfig(TIM3, TIM_IT_CC1, ENABLE);
- TIM_Cmd(TIM2, ENABLE);
- }
- /****************************************************
- * 函数名:angle_set
- * 描述 :无
- * 输入 :无
- * 输出 :无
- * 返回值:无
- ******************************************************/
- void angle_set(u8 dir,u8 angle)
- {
- if(dir==0)
- GPIO_ResetBits(GPIOA, GPIO_Pin_1);//指定引脚输出低电平,此时灯全灭,方向
- else
- GPIO_SetBits(GPIOA, GPIO_Pin_1);//指定引脚输出低电平,此时灯全灭,方向
-
- Output_Pulse(angle*6400);
- }
|