打印
[牛人杂谈]

M051的PWM操作

[复制链接]
382|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
21mengnan|  楼主 | 2019-11-19 23:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
        /* set PWMB channel 1 output configuration */
        PWM_ConfigOutputChannel(PWMB, PWM_CH1, 250, 30);

        /* Enable PWM Output path for PWMB channel 1 */
        PWM_EnableOutput(PWMB, 0x2);

        /* Enable Timer for PWMB channel 1 */
        PWM_Start(PWMB, 0x2);
简单的3个指令,第一个配置输出通道,PWMB发生器,通道1,频率250Hz,占空比30%。
然后使能PWMB的通道1输出,其实0x2就是BIT1           .0b0000 0010.
然后开始运行。。

使用特权

评论回复
沙发
21mengnan|  楼主 | 2019-11-19 23:28 | 只看该作者
PWM捕获
        /* set PWMB channel 2 capture configuration */
        PWM_ConfigCaptureChannel(PWMB, PWM_CH2, 166, 0);

        /* Enable capture falling edge interrupt for PWMB channel 2 */
        PWM_EnableCaptureInt(PWMB, PWM_CH2, PWM_CAPTURE_INT_FALLING_LATCH);

        /* Enable PWMB NVIC interrupt */
        NVIC_EnableIRQ((IRQn_Type)(PWMB_IRQn));

        /* Enable Timer for PWMB channel 2  */
        PWM_Start(PWMB, 0x4);

        /* Enable Capture Function for PWMB channel 2 */
        PWM_EnableCapture(PWMB, 0x4);
配置通道和参数,其实我觉得166这个参数最好由系统自动配置比较好,在函数里实现,获取配置使用的时钟源和分频,经过一个计算就可以自动实现了,还要人算,费时

使用特权

评论回复
板凳
21mengnan|  楼主 | 2019-11-19 23:28 | 只看该作者
捕获属于中断操作,所以带个使能中断。。

使用特权

评论回复
地板
21mengnan|  楼主 | 2019-11-19 23:29 | 只看该作者
同样通道2是对应0x04.
0b 000 0100.

使用特权

评论回复
5
21mengnan|  楼主 | 2019-11-19 23:44 | 只看该作者
捕捉功能使能后,捕捉器在输入通道有上升沿跳变
时,将PWM计数器的值锁存至捕捉上升沿锁存寄存器(CRLR),在输入通道有下降沿跳变时将PWM计数
器值锁存至捕捉下降沿锁存寄存器(CFLR)。

使用特权

评论回复
6
21mengnan|  楼主 | 2019-11-19 23:52 | 只看该作者
/*--------------------------------------------------------------------------------------*/
/* Capture function to calculate the input waveform information                         */
/* u32Count[4] : Keep the internal counter value when input signal rising / falling     */
/*               happens                                                                */
/*                                                                                      */
/* time    A    B     C     D                                                           */
/*           ___   ___   ___   ___   ___   ___   ___   ___                              */
/*      ____|   |_|   |_|   |_|   |_|   |_|   |_|   |_|   |_____                        */
/* index              0 1   2 3                                                         */
/*                                                                                      */
/* The capture internal counter down count from 0x10000, and reload to 0x10000 after    */
/* input signal falling happens (Time B/C/D)                                            */
/*--------------------------------------------------------------------------------------*/

使用特权

评论回复
7
21mengnan|  楼主 | 2019-11-19 23:58 | 只看该作者
请注意上面的文字,说是计数器是从0x10000向下计数。

使用特权

评论回复
8
21mengnan|  楼主 | 2019-11-19 23:58 | 只看该作者
    u16RisingTime = u32Count[1];

    u16FallingTime = u32Count[0];

    u16HighPeroid = u32Count[1] - u32Count[2];

    u16LowPeroid = 0x10000 - u32Count[1];

    u16TotalPeroid = 0x10000 - u32Count[2];

使用特权

评论回复
9
21mengnan|  楼主 | 2019-11-19 23:59 | 只看该作者
所以低电平和高电平计算如上所示。

使用特权

评论回复
10
yiyigirl2014| | 2019-11-20 00:03 | 只看该作者
为防止PWM输出不稳定波形,16位向下计数器和16位比较器采用双缓存。当用户向计数器/比较器寄存
器写入值的时候,只有当向下计数器的值达到0时,被更新的值才会被装载到16位计数器/比较器。该双
缓冲特性避免PWM输出波形上产生毛刺。
当16位向下计数器达到0时,中断请求产生。如果PWM定时器被配置为自动重装载模式,当向下计数器
达到0时,会自动重新装载PWM计数器寄存器(CNRx)的值,并开始递减计数,如此连续重复。如果定时
器设为单触发模式,当向下计数器达到0时,向下计数器停止计数,并产生一个中断请求。
PWM计数器比较器的值(CMRx)用于高电平脉冲宽度调制,当向下计数器的值与比较寄存器的值相同
时,计数器控制逻辑反转输出为高电平。
PWM定时器可复用为数字输入捕捉功能。如果捕捉功能使能,PWM的输出引脚将被切换至捕捉输入模
式。捕捉器0和PWM0使用同一个定时器,捕捉器1和PWM1使用另一组定时器,以此类推。因此在使用
捕捉功能之前,用户必须预先配置PMW定时器。捕捉功能使能后,捕捉器在输入通道有上升沿跳变
时,将PWM计数器的值锁存至捕捉上升沿锁存寄存器(CRLR),在输入通道有下降沿跳变时将PWM计数
器值锁存至捕捉下降沿锁存寄存器(CFLR)。捕捉通道0的中断是可编程的,通过设定.CRL_IE0 (CCR0
[1]) (上升沿锁存中断使能)和CFL_IE0(CCR0[2]) (下降沿锁存中断使能) 来决定中断发生的条件。 通过设
置.CRL_IE1(CCR0 [17])和.CRL_IE1(CCR0[18]),捕捉通道1有同样的特性。通过设置CCR2中的相应
的控制位,每组的通道2到通道3有同样的特性。 对于每一组,不管捕捉何时产生中断0/1/2/3,PWM计
数器0/1/2/3都将在该时刻重载。
最大的捕捉频率受捕捉中断延迟限制。捕捉中断发生时,软件至少要执行三个步骤:读PIIRx 以得到中
断源,读CRLRx/CFLRx(x=0~3) 以得到捕捉值,最后写1清PIIRx为0。 如果中断延迟要花时间T0完成,
在这段时间内(T0),捕捉信号一定不能翻转。在这种情况下,最大的捕捉频率将是1/T0。例如:
HCLK = 50 MHz, PWM_CLK = 25 MHz, 中断延迟时间 900 ns
因此最大的捕捉频率将是1/900ns ≈ 1000 kHz

使用特权

评论回复
11
huahuagg| | 2019-11-20 23:50 | 只看该作者
原来如此。。

使用特权

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

本版积分规则

60

主题

906

帖子

1

粉丝