打印
[PIC®/AVR®/dsPIC®产品]

PIC16F15345的PWM波形无法输出

[复制链接]
1322|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
如题,在用PIC16F15345学习PWM时,无法输出PWM波形,各位大神帮忙看看是哪里有问题。
1.端口配置
void GPIO_Config(void)
{
TRISBbits.TRISB6 = 0;//输出
ANSELBbits.ANSB6 = 0;//数字模式
RB6PPS = 0X0B;//RB6作为PWM3OUT
   
    TRISBbits.TRISB4 = 0;//输出
    ANSELBbits.ANSB4 = 0;//数字模式
    RB4 =1;
    SLRCONBbits.SLRB4 =0;//以最快速度翻转
}
2.Timer2配置
void Timer2_SoftwareGate(void)
{
   
    T2CLKCONbits.CS =2;//Timer2时钟源选择,fosc
    T2CONbits.CKPS = 0;//时钟预分频,128分频
    T2CONbits.OUTPS =1;//输出后分频
    T2HLTbits.CKPOL = 0;//输入时钟有效边沿,0-上升沿,1-下降沿
    T2HLTbits.CKSYNC = 1;//TMER时钟同步
    T2HLTbits.PSYNC = 0;//TMER分频输出与fosc/4同步
    T2HLTbits.MODE = 0x0;//自由运行模式,软件控制
    T2RSTbits.RSEL = 0;//TIMER2外部复位源选择
    T2PR = 200;
    T2CONbits.ON =1;//启动
}
3.PWM配置
void PWM_Config(void)
{
    PWM3CONbits.POL =0;//高有效
    PWM3DCHbits.DC = 0x0F;
    PWM3DCLbits.DC = 0X03;
    PWM3CONbits.EN = 1;
}
4.中断配置
使能TIMER2中断,并在中断中翻转RB4端口。
void Interrput_Config(void)
{
    INTCONbits.GIE =1;
    INTCONbits.PEIE = 1;
    PIE4bits.TMR2IE =1;//使能timer2中断
    PIR4bits.TMR2IF =0;//中断标志位清0
}
void __interrupt() IRS(void)
{
     if(PIE4bits.TMR2IE && PIR4bits.TMR2IF)
     {
         RB4=~RB4;
         PIR4bits.TMR2IF=0;
     }
     else
     {}
}
5.主函数
void main(void)
{
    CLCK_Internal_Config();//32M时钟
    GPIO_Config();
    PWM_Config();
Timer2_SoftwareGate();
    Interrput_Config();
    while(1)
    {
        
    }
    return;
}
可以测得TIMER2在按配置的T2PR = 200产生中断,但在RB6脚上没有PWM波形输出,换了其他的引脚试了,也不能输出波形,是哪些配置不对吗?求赐教,万分感谢!

使用特权

评论回复
沙发
永远不停|  楼主 | 2021-3-3 10:33 | 只看该作者
尝试做了些修改,TIMER2时钟选择会导致问题。
当TIMER2的时钟选择fosc,PWM波形无法输出;当选择时钟为fosc/4,就可以正常输出PWM,且频率正常。
这是为什么,时钟配置为内部32M时钟,fosc为32M,fosc/4为8M,只是频率值不同,为什么会导致无法输出波形?

使用特权

评论回复
板凳
systemchip| | 2021-3-3 11:14 | 只看该作者

使用特权

评论回复
地板
永远不停|  楼主 | 2021-3-3 11:47 | 只看该作者

不是很明白这个PWM模块的原理,TIMER2的8位定时器寄存器,怎么就变成了10位。
The 8-bit timer TMR2 register is concatenated with either the 2-bit internal system clock (FOSC), or two bits of the prescaler, to create the 10-bit time base. The system clock is used if the Timer2 prescaler is set to1:1.
这里2位时钟是指什么?手册中给出了计算PWM周期的公式

同时,给出了一些频率的示例

按照上面的公式,与PWM周期相关的量是PR2,FOSC,TIMER2分频。
在示例中,FOSC不一样,一个为20M,一个为8M,第一列数据,PR2都为0XFF,分频都为16。
那么按照公式计算,20M时,PWM频率 = 20M/(256*4*16)=1.22K;
8M时,PWM频率= 8M/(256*4*16) = 488HZ,
而表中得出的PWM频率一样,都是1.22K,这到底是怎么计算的。

使用特权

评论回复
5
lcczg| | 2021-3-3 12:22 | 只看该作者
本帖最后由 lcczg 于 2021-3-8 10:22 编辑
永远不停 发表于 2021-3-3 11:47
不是很明白这个PWM模块的原理,TIMER2的8位定时器寄存器,怎么就变成了10位。
The 8-bit timer TMR2 regi ...

感谢您的反馈,看下来Table 29-2有错误,以后会更正。

使用特权

评论回复
6
单片小菜| | 2021-3-3 14:41 | 只看该作者
感谢楼主的分享,我也学习一下。

使用特权

评论回复
7
永远不停|  楼主 | 2021-3-3 15:41 | 只看该作者
lcczg 发表于 2021-3-3 12:22
感谢您的反馈,看下来Table 29-2有错误,请等待我们的核实。

另外再请教一下,我将TIMER2的时钟源选择为FOSC/4后,在free模式下可正常输出PWM波形。
当修改模式为ONE-SHOT模式,如果设置了大于1的时钟预分频,也可以正常输出波形,但是当不分频时,就没有波形输出了,这是为什么?

使用特权

评论回复
8
lcczg| | 2021-3-4 11:53 | 只看该作者
永远不停 发表于 2021-3-3 15:41
另外再请教一下,我将TIMER2的时钟源选择为FOSC/4后,在free模式下可正常输出PWM波形。
当修改模式为ONE- ...

此时你的PR和CCPR(周期,占空比)是多少?你的代码是MCC配置的吗?如果不是,可以用MCC配置,然后做个比较。

使用特权

评论回复
9
wakayi| | 2021-4-1 12:07 | 只看该作者
这算是一种bug吗

使用特权

评论回复
10
wowu| | 2021-4-1 12:08 | 只看该作者
在使用中发现问题

使用特权

评论回复
11
xiaoqizi| | 2021-4-1 12:09 | 只看该作者
看更新的文档吧

使用特权

评论回复
12
木木guainv| | 2021-4-1 12:11 | 只看该作者
MCC配置试试看

使用特权

评论回复
13
磨砂| | 2021-4-1 12:14 | 只看该作者
还得根据实际情况来啊

使用特权

评论回复
14
yzq13246068880| | 2021-4-8 10:30 | 只看该作者

使用特权

评论回复
15
skaler1| | 2021-4-15 09:25 | 只看该作者
本帖最后由 skaler1 于 2021-4-15 11:57 编辑

哪位大神帮忙指导一下

使用特权

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

本版积分规则

20

主题

59

帖子

0

粉丝