打印
[STM32F0]

STM32F030的PWM中断解析

[复制链接]
5079|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
liulx14|  楼主 | 2015-9-29 16:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,我是一名使用STM32F030K6片子的新人,在用它的PWM输出功能,现在看了书,书上都是提到了怎么输出PWM,我现在想在PWM能否进入中断,在中断中我想找到高电平状态,在高电平状态下做别的工作,我的例子如下,希望大家帮忙分析
static void TIM1PwmInit(FunctionalState flag)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        TIM_OCInitTypeDef  TIM_OCInitStructure;

        NVIC_InitTypeDef NVIC_InitStructure;

       
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, flag/*ENABLE*/);
       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, flag/*ENABLE*/); //使能定时器1
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
       
        GPIO_PinAFConfig(GPIOA, GPIO_PinSource8, GPIO_AF_2);// 第2 功能TIM1

        //**************************************************************************
        //     定时器1设置: 2分频,24KHz频率,
        //**************************************************************************
        TIM_TimeBaseStructure.TIM_Period = 65535;    // 设置自动重装周期值
        TIM_TimeBaseStructure.TIM_Prescaler = 9;//1;   //2分频
        TIM_TimeBaseStructure.TIM_ClockDivision = 0;//设置时钟分割
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;// 向上计数

        TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);//初始化定时1

        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle;//TIM_OCMode_PWM2;//;//PWM2模式
        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//比较输出使能
        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;//TIM_OCPolarity_High;//;//输出高
        TIM_OCInitStructure.TIM_Pulse = 480;//50;       // 300-1 30%占空比
        TIM_OC1Init(TIM1, &TIM_OCInitStructure);


        TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Disable);//
        //TIM_OC1PreloadConfig(TIM1, ENABLE);

        /* TIM1 enable counter */
        TIM_Cmd(TIM1, flag/*ENABLE*/);

        //TIM_CtrlPWMOutputs(TIM1,flag/*ENABLE*/);

        TIM_ITConfig(TIM1,TIM_IT_CC1,flag/*ENABLE*/);

NVIC_InitStructure.NVIC_IRQChannel = TIM1_CC_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPriority = 5;
NVIC_InitStructure.NVIC_IRQChannelCmd = flag;//ENABLE;
NVIC_Init(&NVIC_InitStructure);
}

void TIM1_CC_IRQHandler(void)       
{
        //TIM1_CH1 输出频率2k
        if (TIM_GetITStatus(TIM1, TIM_IT_CC1) != RESET)
        {
          TIM_ClearITPendingBit(TIM1, TIM_IT_CC1 );
          capture = TIM_GetCapture1(TIM3);
          if(cc1_sig)
          {
                TIM_SetCompare1(TIM1, capture + 480 ); //不知道这里是不是高电平状态下
                cc1_sig =0;
          }
          else
          {
                TIM_SetCompare1(TIM1, capture + 1920 );
                cc1_sig =1;
          }
          
        }



}
沙发
天灵灵地灵灵| | 2015-9-29 16:41 | 只看该作者
楼主这个是自己写的,还是从例程里复制出来的?

使用特权

评论回复
板凳
liulx14|  楼主 | 2015-9-29 23:40 | 只看该作者
天灵灵地灵灵 发表于 2015-9-29 16:41
楼主这个是自己写的,还是从例程里复制出来的?

你好,谢谢你的回答,我是从例子程序里复制出来的,基本上没做更改,有些地方看不懂
1. TIM_OCMode_Toggle和TIM_OCMode_PWM2模式下,不知道PWM有和区别
2.现在是TIM_OCMode_Toggle这个模式,频率的计算书上说是48000/(10*2400)=2KHZ, 为何这里的频率计算和TIM_TimeBaseStructure.TIM_Period = 65535; 没有关系了,如果是TIM_OCMode_PWM2这个模式,频率是
48000/(( TIM_TimeBaseStructure.TIM_Prescaler +1)*TIM_TimeBaseStructure.TIM_Period),他们的计算方法发生了变化。
3.找了很多地方TIM_OCMode_PWM2这个例程都是可以直接对外输出PWM波形,在什么时候是高电平,什么时候是低电平,如果在中断中处理高电平状态,处理低电平状态,没有中断示例,我也是在试验,希望熟悉的朋友能帮忙解答。

使用特权

评论回复
地板
IversonCar| | 2015-9-30 08:24 | 只看该作者
楼主写的非常棒,受益匪浅

使用特权

评论回复
5
天灵灵地灵灵| | 2015-10-10 09:01 | 只看该作者
那个肯定有区别了,一个是翻转,一个是PWM,

使用特权

评论回复
6
huangcunxiake| | 2015-10-10 10:07 | 只看该作者
TIM_OCMode_Toggle和TIM_OCMode_PWM2模式
名字都不同,你可以定位到原型看看,肯定是不同的,一个是翻转,一个是脉宽调制。

使用特权

评论回复
7
迪卡| | 2015-10-12 20:07 | 只看该作者
PWM   脉冲宽度调制     Pulse Width Modulation

使用特权

评论回复
8
liulx14|  楼主 | 2015-10-13 14:58 | 只看该作者
谢谢大家的答复,几天没来,现在是想问大家,输出PWM后,我进入了定时器中断,在PWM定时器中断里,能否用什么去查看现在PWM输出的是高电平还是低电平。

使用特权

评论回复
9
gejigeji521| | 2015-10-13 16:42 | 只看该作者
感觉写那么多行的初始化,不如直接写个函数参数传递。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

17

主题

294

帖子

0

粉丝