打印

频率大约是5KHz

[复制链接]
483|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wangpe|  楼主 | 2020-1-12 17:57 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
配置PIC单片机输出PWM波形,照着数据手册上的公式配置10kHz的频率和50%占空比,最终有方波输出,但是频率大约是5KHz而占空比是50%。

使用特权

评论回复
沙发
songqian17| | 2020-1-12 18:00 | 只看该作者

什么意思?不是很明白你说的什么,能再解释一下这个现象吗

使用特权

评论回复
板凳
wangpe|  楼主 | 2020-1-12 18:03 | 只看该作者

公式1:PWM 周期 = [(PR2) + 1] • 4 • T OSC •(TMR2 预分频值 )

公式2:PWM 占空比 = (CCPR4L:CCP4CON<5:4>) •T OSC • (TMR2 预分频值 )

根据公式算出:PR2=PWM周期/( 4 • T OSC •(TMR2 预分频值 ))-1=45
注:Timer2使用4预分频

CCPR4L:CCP4CON<5:4>=PWM 占空比/(T OSC • (TMR2 预分频值 ))

使用特权

评论回复
地板
gongche| | 2020-1-12 18:06 | 只看该作者

楼主程序可以公开吗?贴程序看下吧,这么说看不出什么原因

使用特权

评论回复
5
wangpe|  楼主 | 2020-1-12 18:08 | 只看该作者

void Timer2_Init();
void Int_Init();
void Init();
void Timer2_PWM_Init();

void main(void)
{
        Init();
        Int_Init();
        Timer2_PWM_Init();
        Timer2_Init();
        while(1)
    {
               
    }
}


//端口初始化
void Init()
{
        TRISG        = 0x00;        //PWM输出
}


//timer2初始化
void Timer2_Init()
{
        //T1CON控制寄存器配置
        T2CON        = 0x01;         //4预分频,不后分频
        
        //配置初值
        TMR2IF        = 0;
        PR2                = 45;                        //设置频率10kHz
        TMR2ON         = 1;                //使能Timer2
}


//PWM(CCP4)模块初始化
void Timer2_PWM_Init()
{
        //CCPxCON :CCPx  控制寄存器 (CCP4-CCP10 模块)
        CCP4CON                = 0x0f;                        //PWM单输出:PxA、 PxB、 PxC 和 PxD 通过转向控制
        
        //CCPTMRS0 :CCP  定时器选择寄存器 1
        C4TSEL1                = 0;                //PWM模式分配Timer2
        C4TSEL0                = 0;               
        
        CCPR4L                = 0x17;                        //设置占空比50%
        DC4B1                = 0;
        DC4B0                = 0;
}


//Timer0中断初始化
void Int_Init()
{
        //INTCON控制寄存器配置
        IPEN         = 0;                        //禁止中断优先级
        GIEH         = 1;                        //允许所有未屏蔽的中断
        GIEL         = 1;                        //允许所有未屏蔽的外设中断,timer1属于外设中断
        TMR2IE         = 1;                        // 允许 TMR0 溢出中断
}


void interrupt Timer2_int(void)
{
        TMR2IF                 = 0;
        
//        CCPR1L                = 0x05;                        //设置占空比50%
//        DC1B1                = 1;
//        DC1B0                = 1;
//        PR2                        = 21;                        //设置频率10kHz
}

使用特权

评论回复
6
wangpe|  楼主 | 2020-1-12 18:16 | 只看该作者
这是我用MPLAB软件仿真输出的波形

使用特权

评论回复
7
wangpe|  楼主 | 2020-1-12 18:19 | 只看该作者

使用特权

评论回复
8
songqian17| | 2020-1-12 18:22 | 只看该作者
没有设置晶振频率

使用特权

评论回复
9
llia| | 2020-1-12 18:25 | 只看该作者
你好,有pic18f67k22的串口程序吗,这单片机的程序不好找,自己看数据手册弄的总不对

使用特权

评论回复
10
CoolSilicon| | 2020-1-13 10:57 | 只看该作者
有几个关键点你要注意:
1. 系统时钟多少? Fosc=2 Fcy
2. PWM模式是边沿对齐还是中心对齐?
应该是有哪里你没理解到引起的这个问题....

使用特权

评论回复
11
wangpe|  楼主 | 2020-1-17 21:11 | 只看该作者

唉,还是没有什么结果,算了,多谢大家啦

使用特权

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

本版积分规则

938

主题

9837

帖子

2

粉丝