OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3915|回复: 0

MINI板F103RCT6 TIM1产生中断,TIM4产生PWM,屏蔽某一方都可以正常工作,同时就两者冲突

[复制链接]

5

主题

12

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2021-5-6
在线时间
8 小时
发表于 2021-7-10 20:56:20 | 显示全部楼层 |阅读模式
主函数:EncodeMotor_Init();//编码电机初始化(TIM4)
   
    TIM1_Int_Init(99,7199);
        
    OLED_Init();//oled初始化
    OLED_Clear(0);

现象:PWM正常,一进入TIM1中断函数,停止产生PWM




//TIM4产生PWM

void EncodeMotor_Init(void){
   
    GPIO_InitTypeDef                    GPIO_InitStructure ;
    TIM_TimeBaseInitTypeDef                TIM_BaseInitStructure;
    TIM_OCInitTypeDef                    TIM_OCInitStructure;
   
    //编码器初始化
    Encode_Init();
   
   
    /*使能GPIOA、AFIO、TIM2外设时钟*/
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);
   
   
    /*初始化PB8端口(TIM2_CH2)为AF_PP模式   左轮PWM*/
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_InitStructure);
   
    //    /*初始化PB9端口(TIM2_CH4)为AF_PP模式  右轮PWM*/
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_InitStructure);
    /*定时器基本配置*/
    TIM_BaseInitStructure.TIM_Prescaler = 719;                                                    //时钟预分频数3,TIM8的计数时钟频率为24MHz
    TIM_BaseInitStructure.TIM_Period = 3000-1;                                                    //自动重装载寄存器数值,PWM2频率为24MHz/1000=24KHz
    TIM_BaseInitStructure.TIM_ClockDivision = 0;                                                //采样分频
    TIM_BaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;                    //向上计数
    TIM_BaseInitStructure.TIM_RepetitionCounter = 0;                                        //重复寄存器
    TIM_TimeBaseInit(TIM4, &TIM_BaseInitStructure);

    //PWM配置
    TIM_OCStructInit(&TIM_OCInitStructure);
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;                                        //PWM1输出模式
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;                //使能该通道输出
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;                        //输出极性
    TIM_OC1Init(TIM4, &TIM_OCInitStructure);                                                        //按指定参数初始化
    TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable);                                        //使能TIM2在CCR2上的预装载寄存器


//    TIM_OCStructInit(&TIM_OCInitStructure);
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;                                        //PWM1输出模式
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;                //使能该通道输出
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;                        //输出极性
    TIM_OC2Init(TIM4, &TIM_OCInitStructure);                                                        //按指定参数初始化
    TIM_OC2PreloadConfig(TIM4, TIM_OCPreload_Enable);                                        //使能TIM2在CCR2上的预装载寄存器
    TIM_ARRPreloadConfig(TIM4, ENABLE);                                                                    //使能TIM2在ARR上的预装载寄存器
   
    TIM_Cmd(TIM4, ENABLE);                                                                                            //打开TIM2
    TIM_CtrlPWMOutputs(TIM4, ENABLE);   
    TIM_SetCompare1(TIM4,2000);
    TIM_SetCompare2(TIM4,2000);                                                            //PWM输出使能

}


//TIM1

void TIM1_Int_Init(u16 arr,u16 psc)
{
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    NVIC_InitTypeDef NVIC_InitStructure;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, 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(TIM1, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位

    TIM_ITConfig(TIM1,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断

   
    //定时器1更新中断
    NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQn;  //TIM1中断
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;  //先占优先级0级
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //从优先级3级
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
    NVIC_Init(&NVIC_InitStructure);  //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
    TIM_Cmd(TIM1, ENABLE);  //使能TIMx外设
                             
}

u16 time_cnt,run_cnt;
//100ms计算一次速度
void TIM1_UP_IRQHandler(void)
{
    if (TIM_GetITStatus(TIM1, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源
    {
        TIM_ClearITPendingBit(TIM1, TIM_IT_Update);  //清除TIMx的中断待处理位:TIM 中断源
        time_cnt ++;
        if(time_cnt >= 5)
        {
            V_left = pause_cnt_left*0.93;
            V_right = pause_cnt_right*0.93;//物理调节0.9
            pause_cnt_left=0;
            pause_cnt_right=0;
            time_cnt =0;
            LED0=!LED0;
          }
        }



正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-23 15:49

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表