STM32同一个定时器PWM输出的同时捕获PWM输入,遇到问题

converter   2010-9-18 14:30 楼主
void TIM2_PWM_INIT(void)        //TIM3配置PWM输出参数
{
    u32 temp_fre,temp_duty;
    TempE = 30;                //设置频率初始值
    TempF = 4;                //设置初始占空比1 / 2
    temp_fre = (1000000 / TempE) - 1;
    temp_duty = ((temp_fre + 1) / TempF);
    TIM_TimeBaseStructure.TIM_Period = temp_fre;      //TIM3通道4的频率
    TIM_TimeBaseStructure.TIM_Prescaler = 72;
    TIM_TimeBaseStructure.TIM_ClockDivision = 0;
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);
     
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
    TIM_OCInitStructure.TIM_Pulse = temp_duty;
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
    TIM_OC4Init(TIM2, &TIM_OCInitStructure);
    TIM_OC4PreloadConfig(TIM2, TIM_OCPreload_Enable);
     
    TIM_ARRPreloadConfig(TIM2, ENABLE);
    TIM_Cmd(TIM2, ENABLE);   
}

void TIM2_PWM_IN_INIT(void)
{
    TIM_ICInitTypeDef  TIM_ICInitStructure;   
    TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;
    TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
    TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
    TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
    TIM_ICInitStructure.TIM_ICFilter = 0x0;
     
    TIM_PWMIConfig(TIM2, &TIM_ICInitStructure);
    /* Select the TIM2 Input Trigger: TI2FP2 */
    TIM_SelectInputTrigger(TIM2, TIM_TS_TI2FP2);
     
    /* Select the slave Mode: Reset Mode */
    TIM_SelectSlaveMode(TIM2, TIM_SlaveMode_Reset);
     
    /* Enable the Master/Slave Mode */
    TIM_SelectMasterSlaveMode(TIM2, TIM_MasterSlaveMode_Enable);
     
    /* TIM enable counter */
    TIM_Cmd(TIM2, ENABLE);
     
    /* Enable the CC2 Interrupt Request */
    TIM_ITConfig(TIM2, TIM_IT_CC2, ENABLE);
}

请看上面的例子!使用TIM2的通道4输出PWM,同时通道2作为PWM捕获输入;发现个现象,PWM输入的频率最小值不能小于PWM输出的值。程序里写的是30HZ,那么输入的PWM波形频率不能小于30HZ;然后,用示波器观察,TIM2的PWM输出频率不能小于50HZ,程序里设置的30HZ,按照理论计算72分频后,1000000/65536 < 20HZ的。可是没办法输出低于50HZ的PWM,请知道的指点一下啊!没办法,我要用STM32F103C8T6来输出4路频率可调,脉宽可调的PWM,还要输入一路PWM,定时器1,2,3,4都用完了,要是再多个定时器就好了!

回复评论 (10)

                                 怎么没有人给我指点一下迷津啊!
点赞  2010-9-18 16:37
1)“发现个现象,PWM输入的频率最小值不能小于PWM输出的值”,这是肯定的!作为PWM输出时,计数器从0累计到你设定的temp_fre,所以作为PWM输入时,只能捕获到temp_fre以下的数值。

2)“用示波器观察,TIM2的PWM输出频率不能小于50HZ,程序里设置的30HZ,按照理论计算72分频后,1000000/65536 < 20HZ的。可是没办法输出低于50HZ的PWM”,不明白你看到了什么?

3)“我要用STM32F103C8T6来输出4路频率可调,脉宽可调的PWM,还要输入一路PWM”,请按照1),找一个最小频率的定时器做为PWM输入,如果输入的频率比较低,可以利用PWM输出时的溢出中断,在中断处理中计数,然后再补偿到输入捕获的数值中。
点赞  2010-9-18 18:42
                                 为什么我的PWM输出频率不能低于50HZ啊
点赞  2010-9-18 22:37
为什么我的PWM输出频率不能低于50HZ啊
用示波器观察,你看到了什么?
点赞  2010-9-18 23:06
                                 搞定了。没有用PWM模式。用了一路定时器,输出比较模式,通过中断控制来实现了4路频率可调,脉宽可调的PWM。还挺好用。然后我就有N个定时器可用了。另外一路作为PWM输入。哈,现在问题都解决了!
点赞  2010-9-19 14:04
呵呵!

这是好事,恭喜LZ
点赞  2010-9-19 14:48
                                 mark
点赞  2010-10-21 09:23
mark
相信自己,力争最佳状态的自己
点赞  2012-2-21 10:52

输入捕捉和输出比较可以用同一个timer实现吗?

输入捕捉和输出比较可以用同一个timer实现吗?
我的意思是系统一直在捕捉信号,不断调整pwm;
如果用同一个timer,难道timer寄存器里面的值不会混乱吗?
点赞  2013-8-28 09:53
点赞  2015-11-9 22:26
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复