BAT32A233:消除不同定时器之间的延迟,用多个定时器输出同频错相的方波或者PWM。

需求描述:

功能需求:输出两路同频错相的方波,相位可调(给直流电源的整流桥用)
但是就是看起来这么简单的一个需求,卡了我一个多星期,闲来无事写个博客记录一下问题和实现方式。


IC限制、问题、解决方法

1.芯片能力限制
BAT32A233(以后简称233)这个芯片不像32电源芯片那样,标准定时器就可以多通道配置输出同频错相,一般是互补的方波,如下图是f334的定时器功能截图。
在这里插入图片描述
但是就算这个图上的定时器,也只能实现错相180°,不能实现相位可调。
然后我看了233的手册,很遗憾,连互补输出都没有,领导告知因为工作温度限制,不能更换IC(这颗IC可以跑120℃的温度,该说不说国产还挺牛的),让我想办法找点”野路子“搞定这个功能。
2.多个定时器实现
没办法,整呗。
既然单个定时器的多通道不能直接实现,那么用两个定时器输出两路,用代码实现延时是否可行呢?
问题1:
233有多个定时器,但是没有相同的定时器,不同的定时器,启动时间是不一样的。
实际测试下来,code上先配置定时器A和B,然后用连续的两行代码直接写他们的start寄存器,仍然会有一个定时器晚一点点时间起来。
这时候自然就想到,先启动慢的那个,延时一段时间再启动快的那个,不就可以了?
那么问题就变成了两个:
1.如何测量当前的延时
2.如何精准的产生需要的延时
那么先说第一个问题,解决办法是示波器测量时间差,因为懒得从示波器搞波形到电脑上,手画了一个两个定时器同时启动输出方波的波形
在这里插入图片描述
用示波器测量两个下降沿的时间差就可以得到精准的延时时间。
第二个问题,如何产生想要的延时?
假设定时器的计数器设定值为50,那么上图方波的一个周期就有100个系统时钟(跳变两次需要计数两次),假设测量得到得延时为10个系统时钟周期。
那么只需要让代码空转10个系统时钟周期就OK了,用__NOP();就可以做到了。

问题2
不同片IC的定时器AB的启动时间差可能不一样,单片IC测出来的延时的值不能作为通用值使用,这个问题应该如何处理?
方法也很简单,定时器A设定计数值为一个较大的值假设为1000,定时器B设定计数值为较小的500,启用定时器B的中断,在中断中去读取定时器A的计数值,这时候读到的值记作X。
不需要用这个X去计算时间差,也算不出来,因为还有中断的反应时间,代码执行的时间,所以只需要记下来就行。
那么记下来干嘛呢?做参考值。
第二片IC如果测到的值也是X,说明这个IC的AB定时器的时间差和测量值一样,延时10个系统时钟周期即可
如果是X+5,那么说明这个IC需要增加5个系统时钟周期的延迟,延迟15个。
如果是X-5,那就延迟5个周期
如果是X-15,那就让A延迟五个周期。
剩下的就是代码实现了。代码实现关键片段如下。

	volatile int time;
	while(time--){
		__NOP();
	}

最后是错相的功能,只需要多延时计数器一半的时间就行了,还是用上面的代码。

  • 5
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值