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

[复制链接]
 楼主| 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模拟。
  1. if(1 == pwm_data[i])
  2.         {
  3.             IR_PWM_Send(32400, 4);
  4.             HAL_TIM_PWM_Stop(&Tim2Handle, TIM_CHANNEL_2);
  5.             IR_PWM_Send(32400, 4);
  6.         }
  7.         else
  8.         {
  9.             IR_PWM_Send(16200, 2);
  10.             HAL_TIM_PWM_Stop(&Tim2Handle, TIM_CHANNEL_2);
  11.             IR_PWM_Send(16200, 2);
  12.         }


中断进去后的处理是这样的。pwm_data中是需要发送的数据,每进入一次中断i++(i是个全局变量,现在只是在实验的阶段,命名什么的没什么规范)。
然后第一个数据就发不出去
309030106 发表于 2015-8-25 17:53 | 显示全部楼层
为什么第一个脉冲发不出来呢
尤彼卡 发表于 2015-8-28 22:07 | 显示全部楼层
楼主,怎么解决的,说下呀
734774645 发表于 2015-8-29 07:40 | 显示全部楼层
第一个发不出来, 就把第一个发两次。
734774645 发表于 2015-8-29 07:41 | 显示全部楼层
以前我做串口也遇到过类似的,前三个字节,发不出去,后面开始都正常了,于是我在代码里,复制进来的代码都在前三个字节自动复制一遍。
玛尼玛尼哄 发表于 2015-8-29 08:30 | 显示全部楼层
楼主找到原因了吗,说出了,让我们好避免类似的错误。
STARM 发表于 2015-8-29 08:36 | 显示全部楼层
>>但是由于是在下个时钟周期才真正有效。
即使是这样,第一个发不出也没有道理啊?
zh113214 发表于 2015-8-29 08:37 来自手机 | 显示全部楼层
串口发送的数据是正确的吗?
玛尼玛尼哄 发表于 2015-8-29 08:50 | 显示全部楼层
如果用一个东西就要研究透彻了。
捉虫天师 发表于 2015-8-29 10:36 | 显示全部楼层

串口发送的数据是正确的吗?
迪卡 发表于 2015-8-29 10:55 | 显示全部楼层
为什么第一个发不出来,不明白
拉克丝 发表于 2015-8-29 11:19 | 显示全部楼层
7楼的方法好像可以啊,在代码里,复制进来的代码都在前三个字节自动复制一遍
捉虫天师 发表于 2015-8-29 11:22 | 显示全部楼层

楼主,怎么解决的,说下呀
稳稳の幸福 发表于 2015-8-29 11:29 | 显示全部楼层
找个例程参考参考,随便改改就行了。
lwsn 发表于 2015-8-30 20:31 | 显示全部楼层
但是到底是什么原因呢
xia00 发表于 2015-8-30 23:14 | 显示全部楼层
想使在配置完后直接起作用,这个好像还挺困难的。。。
皈依 发表于 2015-8-31 08:27 | 显示全部楼层
本帖最后由 皈依 于 2015-8-31 08:37 编辑

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

另外可以发一下你的TIM调整占空比和频率的部分么,想学习一下
 楼主| PhycoKnight 发表于 2015-8-31 14:24 | 显示全部楼层
本帖最后由 PhycoKnight 于 2015-8-31 17:16 编辑
皈依 发表于 2015-8-31 08:27
感谢楼主~学习了根据你的描述,猜测可能是i++执行在ir之前了。。。略过了第0位,或者你函数写 ...
  1. void IR_PWM_Cfg(u32 arr, u32 duty_circle)
  2. {

  3.     TIM_OC_InitTypeDef OCConfig;
  4.    
  5.     //TIM2
  6.     Tim2Handle.Instance = TIM2;
  7.     Tim2Handle.Init.Prescaler = 60 - 1; //计数器频率被分频为1MHz
  8.     Tim2Handle.Init.Period = arr;
  9.     Tim2Handle.Init.ClockDivision = 0;
  10.     Tim2Handle.Init.CounterMode = TIM_COUNTERMODE_DOWN;
  11.     HAL_TIM_PWM_Init(&Tim2Handle);
  12.    
  13.     OCConfig.OCMode = TIM_OCMODE_PWM1;
  14.     OCConfig.OCPolarity = TIM_OCPOLARITY_HIGH;
  15.     OCConfig.OCFastMode = TIM_OCFAST_DISABLE;
  16.     OCConfig.OCIdleState = TIM_OCIDLESTATE_RESET;
  17.     OCConfig.OCNIdleState = TIM_OCNIDLESTATE_RESET;
  18.     OCConfig.Pulse = (uint32_t)(arr+1)*(duty_circle-1)/duty_circle;
  19.    
  20.     HAL_TIM_PWM_ConfigChannel(&Tim2Handle, &OCConfig, TIM_CHANNEL_2);
  21.    
  22.     HAL_TIM_PWM_Start(&Tim2Handle, TIM_CHANNEL_2);
  23.    // HAL_TIM_PWM_Start_IT(&Tim2Handle, TIM_CHANNEL_2); //注意:这个是打开捕获的外部中断的,不是更新中断。


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

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

本版积分规则

2

主题

36

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部