产生2路PWM和4路有以下差别:
1. TA0可以产生2路,TB0可以产生6路,当然也可以只输出2路
2. TB0输出1-6路只是设置对应的控制寄存器,想输出几路完全根据自己需求
如果真是刚接触,多看看官方提供的应用例程,什么模块都有,而且罗列了各种用法,既有汇编也有C,完全根据自己口味来。
在变频器原理中有:变频器的电路一般由整流、中间直流环节、逆变和控制4个部分组成。整流部分为三相桥式不可控整流器,逆变部分为IGBT三相桥式逆变器,且输出为PWM波形,中间直流环节为滤波、直流储能和缓冲无功功率。那么什么是PWM波形呢?
PWM就是脉冲宽度调制,也就是占空比可变的脉冲波形.
PWM控制技术就是以该结论为理论基础,对半导体开关器件的导通和关断进行控制,使输出端得到一系列幅值相等而宽度不相等的脉冲,用这些脉冲来代替正弦波或其他所需要的波形。按一定的规则对各脉冲的宽度进行调制,既可改变逆变电路输出电压的大小,也可改变输出频率。
电流跟踪型PWM变流电路就是对变流电路采用电流跟踪控制。也就是,不用信号波对载波进行调制,而是把希望输出的电流作为指令信号,把实际电流作为反馈信号,通过二者的瞬时值比较来决定逆变电路各功率器件的通断,使实际的输出跟踪电流的变化。
定个时间20ms周期的定时器,然后在定时器到达那些点的时候,让自己设的那些变量依次变化。 再根据自己的变量,付给输出端口就可以了。 看着像舵机的看了你追问的,原来是四路每一路都产生变化的波形。那个也好办。可以通过计算,把这几个波形统一起来成一个周期,比如开始0.5ms到了,让定的值取反,再加19.5再取反,再加1.3Ms再取反,再加18.7ms再取反...然后一直这样把几个都写完。
还有种方法,来改变第一个pwm的设定值。比如放数组里一共5个设定值,分别代表你设定的高电平时间,依次替换第一个定时器里面的中端时间即可。
当然,前两种都差不多,还有一种方法供你扩展:就是用两个定时器,然后按照时间去匹配修改。当然,51单片机那精度就不说了,不太确信可以达标,一个定时器进中断了,另一个就要停一下。。
BTW,个人感觉51的单片机没有很好的pwm模块,这样写了Pwm程序,别的就干不了了。建议用用带epwm模块的mcu,直接调用epwm和epwm中断,节省cpu资源,可以多写很多程序。
1) 当第一次上升沿到达时IC1捕获TIMx_CCR1的值为当前计数值4,IC2不会捕获TIMx_CCR2保持不变,计数器复位从0开始计数。2) 第一个下降沿到达时IC2捕获TIMx_CCR2的值为2表示脉冲宽度。当上升再次到达时TIMx_CCR1的值就表示脉冲周期了(注意:第一次上升沿捕获的是个随机值)。
2)原理也讲过了,那么下面就是实战了
一、 *** 作步骤:
①将我的源码从论坛里面下载下来
②用杜邦线将PB7和PC6连接起来
③将编译完成的hex文件下载到开发板
④打开串口调试助手波特率选9600
⑤按下开发板的复位键,OK那么你就能看到串口的打印信息。
⑥用杜邦线依次将PB7和PC7、PB7和PC8、PB7和PC9连接起来,看串口打印不同占空比和相同周期的信息。
二、主程序讲解:
①TIM3_PWM_Init(1000-1,72-1) //1KHz的周期
这个计算相信大部分人应该没有问题原子哥也做过详细的讲解那么我在重复一遍
CPU主频是72MHZ 这里将72MHZ主频72分频,那么就为1MHZ,所以计数器每加1那么就是代表增加1US,我这里设置的是999,因为0-999正好是1000us,所以我设置的周期是1000us 也就是1KHZ
②TIM_SetCompare1(TIM3,200)
这个函数式设置PWM通道的占空比,因为周期是1000us所以我这里设置的是20%的占空比,这个计算我就算教小白吧 占空比 = 200/1000 我这里设置的是通道1也就是PC6的占空比。下面三个我就不讲了。
③TIM4_PWMINPUT_INIT(0xffff,72-1)
这个函数是PWM输入模式初始化,这个我设置的最大计数是0xffff,因为是16位的计数器当然最大也只能这么大了,后面的参数是设置捕捉频率的,我这里还设置为1MHz,这样为了好看实验现象。
④While(1){}
主程序那三个打印语句我就不讲了,这个都不会,那么你就该补补了。
三、四路PWM程序讲解:
①void TIM3_PWM_Init(u16 arr,u16 psc)
这个函数我不讲很多因为原子哥已经将的很清楚了,我就将几个注意的地方和大家说一下,
GPIO_PinRemapConfig(GPIO_FullRemap_TIM3, ENABLE)这个函数式定时器的全映射,将
TIM3定时器的引脚映射到了PC6 PC7 PC8 PC9上了。
四、PWM输入捕捉程序讲解:
①void TIM4_PWMINPUT_INIT(u16 arr,u16 psc)
这个函数我在源码里面已经注释的很清楚了,有几个点需要大家注意
②TIM_SelectInputTrigger(TIM4, TIM_TS_TI2FP2)
这个是选择有效的输入端 ,我这里TIM_TS_TI2FP2选择的PB7,注意:只有TI1FP1和TI2FP2连到了从模式控制器,所以PWM输入模式只能使用TIMx_CH1 /TIMx_CH2信号。
③TIM_SelectSlaveMode(TIM4, TIM_SlaveMode_Reset)
这个是配置为PWM输入主从复位模式,就是每次输入端有效电平变化的时候定时器计数器就会硬件上置0
中断函数讲解
至于TIM4的中断函数很简单我就不多讲什么了,主要就是将捕捉到的周期和占空比记录下来。
注意:我提醒大家一下,我现在这个捕捉的周期的范围是1-65535us,如果你要捕捉的周期超出这个怎么办,我给大家一点建议①将捕获精度降低,也就是讲捕获频率降下来②这个就是用原子哥那种溢出计数的方法,但是这个有意思的是主从复位模式,每次复位也会产生更新中断,那么如果不加设置的话,可能这种方法是行不通的。但是我已经解决了,看手册介绍,解决的。哈哈,大家有兴趣的话,可以去试着解决,自己做的饭才是最香的。实在是想用第二种方法,但是又解决不了的,就可以回复,但是我想着还是自己解决的好。
说了这么多,有的人可能会提出疑问?那你给我们讲这些理论,你自己到底实现了没有?俗话说的好,有图有真相,没图说啥?那么好的上真相,不过是有误差的,但是我认为这个误差在接受范围内。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)