[PIC®/AVR®/dsPIC®产品] PIC16F15345的PWM波形无法输出

[复制链接]
 楼主| 永远不停 发表于 2021-3-2 20:34 | 显示全部楼层 |阅读模式
如题,在用PIC16F15345学习PWM时,无法输出PWM波形,各位大神帮忙看看是哪里有问题。
1.端口配置
  1. void GPIO_Config(void)
  2. {
  3. TRISBbits.TRISB6 = 0;//输出
  4. ANSELBbits.ANSB6 = 0;//数字模式
  5. RB6PPS = 0X0B;//RB6作为PWM3OUT
  6.    
  7.     TRISBbits.TRISB4 = 0;//输出
  8.     ANSELBbits.ANSB4 = 0;//数字模式
  9.     RB4 =1;
  10.     SLRCONBbits.SLRB4 =0;//以最快速度翻转
  11. }
2.Timer2配置
  1. void Timer2_SoftwareGate(void)
  2. {
  3.    
  4.     T2CLKCONbits.CS =2;//Timer2时钟源选择,fosc
  5.     T2CONbits.CKPS = 0;//时钟预分频,128分频
  6.     T2CONbits.OUTPS =1;//输出后分频
  7.     T2HLTbits.CKPOL = 0;//输入时钟有效边沿,0-上升沿,1-下降沿
  8.     T2HLTbits.CKSYNC = 1;//TMER时钟同步
  9.     T2HLTbits.PSYNC = 0;//TMER分频输出与fosc/4同步
  10.     T2HLTbits.MODE = 0x0;//自由运行模式,软件控制
  11.     T2RSTbits.RSEL = 0;//TIMER2外部复位源选择
  12.     T2PR = 200;
  13.     T2CONbits.ON =1;//启动
  14. }
3.PWM配置
  1. void PWM_Config(void)
  2. {
  3.     PWM3CONbits.POL =0;//高有效
  4.     PWM3DCHbits.DC = 0x0F;
  5.     PWM3DCLbits.DC = 0X03;
  6.     PWM3CONbits.EN = 1;
  7. }
4.中断配置
使能TIMER2中断,并在中断中翻转RB4端口。
  1. void Interrput_Config(void)
  2. {
  3.     INTCONbits.GIE =1;
  4.     INTCONbits.PEIE = 1;
  5.     PIE4bits.TMR2IE =1;//使能timer2中断
  6.     PIR4bits.TMR2IF =0;//中断标志位清0
  7. }
  8. void __interrupt() IRS(void)
  9. {
  10.      if(PIE4bits.TMR2IE && PIR4bits.TMR2IF)
  11.      {
  12.          RB4=~RB4;
  13.          PIR4bits.TMR2IF=0;
  14.      }
  15.      else
  16.      {}
  17. }
5.主函数
  1. void main(void)
  2. {
  3.     CLCK_Internal_Config();//32M时钟
  4.     GPIO_Config();
  5.     PWM_Config();
  6. Timer2_SoftwareGate();
  7.     Interrput_Config();
  8.     while(1)
  9.     {
  10.         
  11.     }
  12.     return;
  13. }
可以测得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,这到底是怎么计算的。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
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有错误,以后会更正。
单片小菜 发表于 2021-3-3 14:41 | 显示全部楼层
感谢楼主的分享,我也学习一下。
 楼主| 永远不停 发表于 2021-3-3 15:41 | 显示全部楼层
lcczg 发表于 2021-3-3 12:22
感谢您的反馈,看下来Table 29-2有错误,请等待我们的核实。

另外再请教一下,我将TIMER2的时钟源选择为FOSC/4后,在free模式下可正常输出PWM波形。
当修改模式为ONE-SHOT模式,如果设置了大于1的时钟预分频,也可以正常输出波形,但是当不分频时,就没有波形输出了,这是为什么?
lcczg 发表于 2021-3-4 11:53 | 显示全部楼层
永远不停 发表于 2021-3-3 15:41
另外再请教一下,我将TIMER2的时钟源选择为FOSC/4后,在free模式下可正常输出PWM波形。
当修改模式为ONE- ...

此时你的PR和CCPR(周期,占空比)是多少?你的代码是MCC配置的吗?如果不是,可以用MCC配置,然后做个比较。
wakayi 发表于 2021-4-1 12:07 | 显示全部楼层
这算是一种bug吗
wowu 发表于 2021-4-1 12:08 | 显示全部楼层
在使用中发现问题
xiaoqizi 发表于 2021-4-1 12:09 | 显示全部楼层
看更新的文档吧
木木guainv 发表于 2021-4-1 12:11 | 显示全部楼层
MCC配置试试看
磨砂 发表于 2021-4-1 12:14 | 显示全部楼层
还得根据实际情况来啊
yzq13246068880 发表于 2021-4-8 10:30 | 显示全部楼层
skaler1 发表于 2021-4-15 09:25 | 显示全部楼层
本帖最后由 skaler1 于 2021-4-15 11:57 编辑

哪位大神帮忙指导一下

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
您需要登录后才可以回帖 登录 | 注册

本版积分规则

20

主题

59

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部

20

主题

59

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部