初级会员

- 积分
- 178
- 金钱
- 178
- 注册时间
- 2020-6-21
- 在线时间
- 70 小时
|
我要控制11个无刷电机,需要11路PWM波占空比调速。无刷电机自己带了反馈线,会反馈信号。所以我又需要11路输入捕获。
我配置了一下定时器2做测试。 CH1 CH2输入捕获,CH3 CH4输出占空比可调的方波。
结果测试出来当CH1 (PA0)连上CH3的时候,CH2也同时有值...
我怀疑是我的配置出现了问题。有没有大哥,给小弟解惑一下。
下面贴代码,主要代码如下:
- /********************************************************
- *@函数名称:TIM2_Cap_Init()
- *@功能说明:定时器2初始化
- *@引脚说明:PA0 CH1 输入捕获
- * PA1 CH2 输入捕获
- * PA2 CH3 输出PWM
- * PA3 CH4 输出PWM
- *@输入参数:u16 _arr 重装载值 u16 _psc 预分频值 CCRx初始值为0
- *@返回参数:无
- */
- void TIM2_Cap_Init(u16 _arr,u16 _psc)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
- NVIC_InitTypeDef NVIC_InitStructure;
- TIM_ICInitTypeDef TIM2_ICInitStructure;
- TIM_OCInitTypeDef TIM_OCInitStructure;
-
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //使能TIM2时钟
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能GPIOA时钟
- /***********************PA0~PA3四个通道配置*********************/
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1; //PA0 PA1 输入捕获
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
- GPIO_Init(GPIOA, &GPIO_InitStructure);
- GPIO_ResetBits(GPIOA,GPIO_Pin_0);
- GPIO_ResetBits(GPIOA,GPIO_Pin_1);
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3; //PA2 PA3
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOA, &GPIO_InitStructure);
-
- /***************************************************************/
- /**************************初始化定时器2 TIM2 ******************/
- TIM_TimeBaseStructure.TIM_Period = _arr; //设定计数器自动重装值
- TIM_TimeBaseStructure.TIM_Prescaler = _psc; //预分频器
- TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
- TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
- TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
-
- //初始化TIM2输入捕获参数
- TIM2_ICInitStructure.TIM_Channel = TIM_Channel_1; //CC1S=03 选择输入端 IC1映射到TI3上
- TIM2_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //上升沿捕获
- TIM2_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //映射到TI1上
- TIM2_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //配置输入分频,不分频
- TIM2_ICInitStructure.TIM_ICFilter = 0x00;//IC1F=0000 配置输入滤波器 不滤波
- TIM_ICInit(TIM2, &TIM2_ICInitStructure);
-
- TIM2_ICInitStructure.TIM_Channel = TIM_Channel_2; //CC1S=03 选择输入端 IC1映射到TI3上
- TIM2_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //上升沿捕获
- TIM2_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //映射到TI1上
- TIM2_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //配置输入分频,不分频
- TIM2_ICInitStructure.TIM_ICFilter = 0x00;//IC1F=0000 配置输入滤波器 不滤波
- TIM_ICInit(TIM2, &TIM2_ICInitStructure);
-
-
- //初始化TIM2PWM输出参数
- TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2
- TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
- TIM_OCInitStructure.TIM_Pulse = (_arr/2); //设置待装入捕获比较寄存器的脉冲值
- TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
- TIM_OC3Init(TIM2, &TIM_OCInitStructure); //根据TIM_OCInitStruct中指定的参数初始化外设TIMx
- TIM_OC4Init(TIM2, &TIM_OCInitStructure);
-
- //中断分组初始化
- NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; //TIM2中断
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //先占优先级2级
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //从优先级0级
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
- NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
-
- TIM_ITConfig(TIM2,TIM_IT_CC1,ENABLE);//允许CC1IE捕获中断
- TIM_ITConfig(TIM2,TIM_IT_CC2,ENABLE);//允许CC2IE捕获中断
-
- TIM_OC3PreloadConfig(TIM2, TIM_OCPreload_Enable); //CH3预装载使能
- TIM_OC4PreloadConfig(TIM2, TIM_OCPreload_Enable); //CH4预装载使能
- TIM_ARRPreloadConfig(TIM2, ENABLE); //使能TIMx在ARR上的预装载寄存器
-
- TIM_Cmd(TIM2,ENABLE ); //使能定时器2
- }
复制代码- void TIM2_IRQHandler(void)
- {
- if (TIM_GetITStatus(TIM2, TIM_IT_CC1) != RESET)
- {
- CapFlag.TIM2_CH1++;
- TIM_ClearITPendingBit(TIM2, TIM_IT_CC1);
- }
-
- if (TIM_GetITStatus(TIM2, TIM_IT_CC2) != RESET)
- {
- CapFlag.TIM2_CH2++;
- TIM_ClearITPendingBit(TIM2, TIM_IT_CC2);
- }
- }
复制代码- void TIM6_Int_Init(u16 arr,u16 psc)
- {
- TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
- NVIC_InitTypeDef NVIC_InitStructure;
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE); //时钟使能
- TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 计数到5000为500ms
- TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值 10Khz的计数频率
- TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
- TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
- TIM_TimeBaseInit(TIM6, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
-
- TIM_ITConfig(TIM6, TIM_IT_Update, ENABLE);
- NVIC_InitStructure.NVIC_IRQChannel = TIM6_IRQn; //TIM3中断
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级0级
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级3级
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
- NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
- TIM_Cmd(TIM6, ENABLE); //使能TIMx外设
- }
复制代码- void TIM6_IRQHandler(void) //TIM3中断
- {
- if (TIM_GetITStatus(TIM6, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源
- {
- TIM_ClearITPendingBit(TIM6, TIM_IT_Update ); //清除TIMx的中断待处理位:TIM 中断源
- printf("\r\nTIM2_CH1_PA0:%d\r\n",CapFlag.TIM2_CH1);
- printf("TIM2_CH2_PA1:%d\r\n",CapFlag.TIM2_CH2);
- CapFlag.TIM2_CH1=0;
- CapFlag.TIM2_CH2=0;
- }
- }
复制代码
其中定时器6是普通定时器,我配置成每秒在串口打印一下TIM2_CHx的值
TIM2定时器配置成我说的模式。
下面贴一下整个代码
TIM2.zip
(4.48 MB, 下载次数: 14)
|
|