打印
[STM32F2]

STM32F2的pwm波的设置问题,如何立即有效

[复制链接]
3246|33
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
PhycoKnight|  楼主 | 2015-8-24 15:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我做了一个接口函数,函数可以调整pwm波的频率和占空比。
手册上写到:
    真正的计数器使能信号CNT_EN是在CEN的一个时钟周期后被设置。
那么也就是实际上我设置完了之后,这个配置真正开始有效是在一个时钟周期之后。

比如 想发送一个1011的信息。用pwm波A的一个周期来表示1,B表示0.

连续的发送实际上就是 利用那个接口函数配置ABAA,就这样。但是由于是在下个时钟周期才真正有效。所以,发送的时序就是错的。有什么方法可以在配置完后直接起作用吗?

不知道我说的清不清楚。
沙发
mmuuss586| | 2015-8-24 19:02 | 只看该作者
可以先关掉,再初始化,再重新打开试下;

使用特权

评论回复
板凳
PhycoKnight|  楼主 | 2015-8-25 13:16 | 只看该作者
mmuuss586 发表于 2015-8-24 19:02
可以先关掉,再初始化,再重新打开试下;

感谢回复。按照大神说的方式实现后,第一个脉冲发不出来,但是后面所有的数据时序都对。不知道什么情况
我是在中断里面做的。
就是利用可调的PWM波实现红外的数据发送。不用IO模拟。
if(1 == pwm_data[i])
        {
            IR_PWM_Send(32400, 4);
            HAL_TIM_PWM_Stop(&Tim2Handle, TIM_CHANNEL_2);
            IR_PWM_Send(32400, 4);
        }
        else
        {
            IR_PWM_Send(16200, 2);
            HAL_TIM_PWM_Stop(&Tim2Handle, TIM_CHANNEL_2);
            IR_PWM_Send(16200, 2);
        }


中断进去后的处理是这样的。pwm_data中是需要发送的数据,每进入一次中断i++(i是个全局变量,现在只是在实验的阶段,命名什么的没什么规范)。
然后第一个数据就发不出去

使用特权

评论回复
地板
309030106| | 2015-8-25 17:53 | 只看该作者
为什么第一个脉冲发不出来呢

使用特权

评论回复
5
尤彼卡| | 2015-8-28 22:07 | 只看该作者
楼主,怎么解决的,说下呀

使用特权

评论回复
6
734774645| | 2015-8-29 07:40 | 只看该作者
第一个发不出来, 就把第一个发两次。

使用特权

评论回复
7
734774645| | 2015-8-29 07:41 | 只看该作者
以前我做串口也遇到过类似的,前三个字节,发不出去,后面开始都正常了,于是我在代码里,复制进来的代码都在前三个字节自动复制一遍。

使用特权

评论回复
8
玛尼玛尼哄| | 2015-8-29 08:30 | 只看该作者
楼主找到原因了吗,说出了,让我们好避免类似的错误。

使用特权

评论回复
9
STARM| | 2015-8-29 08:36 | 只看该作者
>>但是由于是在下个时钟周期才真正有效。
即使是这样,第一个发不出也没有道理啊?

使用特权

评论回复
10
zh113214| | 2015-8-29 08:37 | 只看该作者
串口发送的数据是正确的吗?

使用特权

评论回复
11
玛尼玛尼哄| | 2015-8-29 08:50 | 只看该作者
如果用一个东西就要研究透彻了。

使用特权

评论回复
12
捉虫天师| | 2015-8-29 10:36 | 只看该作者

串口发送的数据是正确的吗?

使用特权

评论回复
13
迪卡| | 2015-8-29 10:55 | 只看该作者
为什么第一个发不出来,不明白

使用特权

评论回复
14
拉克丝| | 2015-8-29 11:19 | 只看该作者
7楼的方法好像可以啊,在代码里,复制进来的代码都在前三个字节自动复制一遍

使用特权

评论回复
15
捉虫天师| | 2015-8-29 11:22 | 只看该作者

楼主,怎么解决的,说下呀

使用特权

评论回复
16
稳稳の幸福| | 2015-8-29 11:29 | 只看该作者
找个例程参考参考,随便改改就行了。

使用特权

评论回复
17
lwsn| | 2015-8-30 20:31 | 只看该作者
但是到底是什么原因呢

使用特权

评论回复
18
xia00| | 2015-8-30 23:14 | 只看该作者
想使在配置完后直接起作用,这个好像还挺困难的。。。

使用特权

评论回复
19
皈依| | 2015-8-31 08:27 | 只看该作者
本帖最后由 皈依 于 2015-8-31 08:37 编辑

感谢楼主~学习了根据你的描述,猜测可能是i++执行在ir之前了。。。略过了第0位,或者你函数写的i=1 直接略过了第0位。。。
要检查一下中断部分以及触发方式。

另外可以发一下你的TIM调整占空比和频率的部分么,想学习一下

使用特权

评论回复
20
PhycoKnight|  楼主 | 2015-8-31 14:24 | 只看该作者
本帖最后由 PhycoKnight 于 2015-8-31 17:16 编辑
皈依 发表于 2015-8-31 08:27
感谢楼主~学习了根据你的描述,猜测可能是i++执行在ir之前了。。。略过了第0位,或者你函数写 ...
void IR_PWM_Cfg(u32 arr, u32 duty_circle)
{

    TIM_OC_InitTypeDef OCConfig;
   
    //TIM2
    Tim2Handle.Instance = TIM2;
    Tim2Handle.Init.Prescaler = 60 - 1; //计数器频率被分频为1MHz
    Tim2Handle.Init.Period = arr;
    Tim2Handle.Init.ClockDivision = 0;
    Tim2Handle.Init.CounterMode = TIM_COUNTERMODE_DOWN;
    HAL_TIM_PWM_Init(&Tim2Handle);
   
    OCConfig.OCMode = TIM_OCMODE_PWM1;
    OCConfig.OCPolarity = TIM_OCPOLARITY_HIGH;
    OCConfig.OCFastMode = TIM_OCFAST_DISABLE;
    OCConfig.OCIdleState = TIM_OCIDLESTATE_RESET;
    OCConfig.OCNIdleState = TIM_OCNIDLESTATE_RESET;
    OCConfig.Pulse = (uint32_t)(arr+1)*(duty_circle-1)/duty_circle;
   
    HAL_TIM_PWM_ConfigChannel(&Tim2Handle, &OCConfig, TIM_CHANNEL_2);
   
    HAL_TIM_PWM_Start(&Tim2Handle, TIM_CHANNEL_2);
   // HAL_TIM_PWM_Start_IT(&Tim2Handle, TIM_CHANNEL_2); //注意:这个是打开捕获的外部中断的,不是更新中断。


这个配置应该不难吧。还要注意打开时钟,然后GPIO口设置为复用推挽
GPIO_InitStruct.Pin = GPIO_PIN_1;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FAST;
    GPIO_InitStruct.Alternate = GPIO_AF1_TIM2;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

使用特权

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

本版积分规则

2

主题

36

帖子

0

粉丝