OpenEdv-开源电子网

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

PWM互补输出,我配置好了然后进入中断好使,为什么不能实现输出了?

[复制链接]

1

主题

2

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2016-11-16
在线时间
1 小时
发表于 2016-11-24 20:04:32 | 显示全部楼层 |阅读模式
[mw_shl_code=applescript,true]#include "bsp_AdvanceTim.h"

uint16_t Counter_sine=0;
uint16_t Duty_Cycle_sinewavetable[9]={1,2,3,4,5,6,7,8,9};
//extern uint16_t Counter_sine;
//extern uint16_t Duty_Cycle_sinewavetable[9];

//pwm输出GPIO配置
static void ADVANCE_TIM_GPIO_Config(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;

  // 输出比较通道 GPIO1 初始化
        RCC_APB2PeriphClockCmd(ADVANCE_TIM_CH1_GPIO_CLK, ENABLE);
  GPIO_InitStructure.GPIO_Pin =  ADVANCE_TIM_CH1_PIN;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(ADVANCE_TIM_CH1_PORT, &GPIO_InitStructure);

  // 输出比较通道互补通道 GPIO1 初始化
        RCC_APB2PeriphClockCmd(ADVANCE_TIM_CH1N_GPIO_CLK, ENABLE);
  GPIO_InitStructure.GPIO_Pin =  ADVANCE_TIM_CH1N_PIN;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(ADVANCE_TIM_CH1N_PORT, &GPIO_InitStructure);

  // 输出比较通道刹车通道 GPIO1 初始化
        RCC_APB2PeriphClockCmd(ADVANCE_TIM_BKIN_GPIO_CLK, ENABLE);
  GPIO_InitStructure.GPIO_Pin =  ADVANCE_TIM_BKIN_PIN;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(ADVANCE_TIM_BKIN_PORT, &GPIO_InitStructure);
        // BKIN引脚默认先输出低电平
        GPIO_ResetBits(ADVANCE_TIM_BKIN_PORT,ADVANCE_TIM_BKIN_PIN);        
}



// 中断优先级配置

static void ADVANCE_TIM_NVIC_Config(void)
{
    NVIC_InitTypeDef NVIC_InitStructure;
    // 设置中断组为0
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);               
                // 设置中断来源
    NVIC_InitStructure.NVIC_IRQChannel = ADVANCE_TIM_IRQ ;        
                // 设置主优先级为 0
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;         
          // 设置抢占优先级为3
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;        
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
}



static void ADVANCE_TIM_Mode_Config(void)
{
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;               
                // 开启定时器时钟,即内部时钟CK_INT=72M
    ADVANCE_TIM_APBxClock_FUN(ADVANCE_TIM_CLK, ENABLE);        
                // 自动重装载寄存器的值,累计TIM_Period+1个频率后产生一个更新或者中断
    TIM_TimeBaseStructure.TIM_Period=ADVANCE_TIM_Period;
          // 时钟预分频数
    TIM_TimeBaseStructure.TIM_Prescaler= ADVANCE_TIM_Prescaler;        
                // 时钟分频因子 ,没用到不用管
    TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;               
                // 计数器计数模式,设置为向上计数
    TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;                 
                // 重复计数器的值,没用到不用管
                TIM_TimeBaseStructure.TIM_RepetitionCounter=0;        
          // 初始化定时器
    TIM_TimeBaseInit(ADVANCE_TIM, &TIM_TimeBaseStructure);
        
                // 清除计数器中断标志位
    TIM_ClearFlag(ADVANCE_TIM, TIM_FLAG_Update);
         
                // 开启计数器中断
    TIM_ITConfig(ADVANCE_TIM,TIM_IT_Update,ENABLE);
               
                // 使能计数器
    TIM_Cmd(ADVANCE_TIM, ENABLE);
               
               
                /*--------------------输出比较结构体初始化-------------------*/               
        TIM_OCInitTypeDef  TIM_OCInitStructure;
        // 配置为PWM模式1
        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
        // 输出使能
        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
        // 互补输出使能
        TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
        // 设置占空比大小
        TIM_OCInitStructure.TIM_Pulse = Duty_Cycle_sinewavetable[Counter_sine];
        // 输出通道电平极性配置
        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
        // 互补输出通道电平极性配置
        TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;
        // 输出通道空闲电平极性配置
        TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
        // 互补输出通道空闲电平极性配置
        TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;
        TIM_OC1Init(ADVANCE_TIM, &TIM_OCInitStructure);
        TIM_OC1PreloadConfig(ADVANCE_TIM, TIM_OCPreload_Enable);

        /*-------------------刹车和死区结构体初始化-------------------*/
        // 有关刹车和死区结构体的成员具体可参考BDTR寄存器的描述
        TIM_BDTRInitTypeDef TIM_BDTRInitStructure;
  TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable;
  TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable;
  TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_1;
        // 输出比较信号死区时间配置,具体如何计算可参考 BDTR:UTG[7:0]的描述
        // 这里配置的死区时间为152ns
  TIM_BDTRInitStructure.TIM_DeadTime = 11;
  TIM_BDTRInitStructure.TIM_Break = TIM_Break_Enable;
        // 当BKIN引脚检测到高电平的时候,输出比较信号被禁止,就好像是刹车一样
  TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_High;
  TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable;
  TIM_BDTRConfig(ADVANCE_TIM, &TIM_BDTRInitStructure);
        
        // 使能计数器
        TIM_Cmd(ADVANCE_TIM, ENABLE);        
        // 主输出使能,当使用的是通用定时器时,这句不需要
        TIM_CtrlPWMOutputs(ADVANCE_TIM, ENABLE);
}

void ADVANCE_TIM_Init(void)
{
        ADVANCE_TIM_GPIO_Config();
        ADVANCE_TIM_NVIC_Config();
        ADVANCE_TIM_Mode_Config();               
}

/*********************************************END OF FILE**********************/

我想知道这样配置进入中断好使为什么PWM互补输出不好使了?[/mw_shl_code]
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
154
金钱
154
注册时间
2015-12-26
在线时间
41 小时
发表于 2016-11-25 11:12:14 | 显示全部楼层
LZ可以参考http://www.openedv.com/forum.php?mod=viewthread&tid=62861这里,里面对PWM互补输出和PWM死区讲解的很详细。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-26 07:44

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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