打印

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

[复制链接]
7414|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
honami520|  楼主 | 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都用完了,要是再多个定时器就好了!
沙发
honami520|  楼主 | 2010-9-18 16:37 | 只看该作者
怎么没有人给我指点一下迷津啊!

使用特权

评论回复
板凳
香水城| | 2010-9-18 18:42 | 只看该作者
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输出时的溢出中断,在中断处理中计数,然后再补偿到输入捕获的数值中。

使用特权

评论回复
地板
honami520|  楼主 | 2010-9-18 22:37 | 只看该作者
为什么我的PWM输出频率不能低于50HZ啊

使用特权

评论回复
5
香水城| | 2010-9-18 23:06 | 只看该作者
为什么我的PWM输出频率不能低于50HZ啊
honami520 发表于 2010-9-18 22:37


用示波器观察,你看到了什么?

使用特权

评论回复
6
honami520|  楼主 | 2010-9-19 14:04 | 只看该作者
搞定了。没有用PWM模式。用了一路定时器,输出比较模式,通过中断控制来实现了4路频率可调,脉宽可调的PWM。还挺好用。然后我就有N个定时器可用了。另外一路作为PWM输入。哈,现在问题都解决了!

使用特权

评论回复
7
xuyiyi| | 2010-9-19 14:48 | 只看该作者
呵呵!

这是好事,恭喜LZ

使用特权

评论回复
8
PXJ_520| | 2010-10-21 09:23 | 只看该作者
mark

使用特权

评论回复
9
skylinyk| | 2013-10-22 20:46 | 只看该作者
mark 一下

使用特权

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

本版积分规则

25

主题

189

帖子

2

粉丝