打印

PIC24FJ 关于pwm 频率和占空比的计算;

[复制链接]
11867|21
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
isbit|  楼主 | 2011-2-15 10:11 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
main.c

程序代码如下:



//--------------------
//PWM测试程序
//--------------------
#include <p24Fxxxx.h>
_CONFIG3( WPFP_WPFP0 & SOSCSEL_IO & WUTSEL_LEG & WPDIS_WPDIS & WPCFG_WPCFGDIS & WPEND_WPENDMEM )
_CONFIG2( FNOSC_PRIPLL & POSCMOD_HS )//& PLL96MHZ_ON & PLLDIV_DIV5 )
//_CONFIG1( GCP_ON & JTAGEN_OFF & FWDTEN_OFF & ICS_PGx2 )

#if 1
/* INT is processor specific in length may vary in size */
typedef signed int          INT;
typedef signed char         INT8;
typedef signed short int    INT16;
typedef signed long int     INT32;

/* UINT is processor specific in length may vary in size */
typedef unsigned int        UINT;
typedef unsigned char       UINT8;
typedef unsigned short int  UINT16;
/* 24-bit type only available on C18 */
typedef unsigned long int   UINT32;     /* other name for 32-bit integer */
/* MPLAB C Compiler for PIC18 does not support 64-bit integers */
#endif
void oc1_inint(UINT16 PR2_num,UINT16 OC1R_num,UINT16 OC1RS_num);


void oc1_inint(UINT16 PR2_num,UINT16 OC1R_num,UINT16 OC1RS_num)
{
TRISBbits.TRISB13=0;
RPOR6bits.RP13R =18;// OC1_IO;  //RP15作为OC1输出

T2CON = 0;
TMR2 = 0;
//-----6,25kHZ----------
PR2 = PR2_num;//1060;
OC1R = OC1R_num;//530;
OC1RS = OC1RS_num;//530;
//----------------
OC1CON1 = 0x0006;  //PWM  
T2CON = (1 << 15)|(0 << 5)|(0 << 4); //启动时钟,1分频
IEC0 |= 0x0100;         //允许T2,中断

}
//-------------------------
//     main ()函数
//
//-------------------------
int main(void)
{

// Set up clock settings
CLKDIV    = 0x0000;
OSCCON    = 0x3302;   // Enable secondary oscillator, use HS oscillator
  TRISB = 0x0FFF;    //设置LED为输出RB15-RB12
  RPOR6bits.RP13R = 18;    //RP15作为OC1输出
  T2CON = (1 << 15)|(0 << 5)|(0 << 4);   //启动时钟,1分频
oc1_inint(1060,530,530);  //PWM 初始化,6,25kHZ
  while(1)
  {
;
  }

  return 0;  
}


我的程序,pwm出来的方波是6.25kHZ(160us)
但是和datasheet上面的方法,无法算出来这个值;


外部晶振20M
T2CON = (1 << 15)|(0 << 5)|(0 << 4); //启动时钟,1分频
TCY=TCY/2=(1000/20M)/2=25ns;


pwm周期=(PR2+1)*TCY*(Timer2预分频值)
pwm周期=1061*25ns*1
pwm周期=26.5us  
而实际是160us

请问是哪里的问题?
程序配置位:
_CONFIG3( WPFP_WPFP0 & SOSCSEL_IO & WUTSEL_LEG & WPDIS_WPDIS & WPCFG_WPCFGDIS & WPEND_WPENDMEM )
_CONFIG2( FNOSC_PRIPLL & POSCMOD_HS

pwm.jpg (85.75 KB )

pwm.jpg

pwm.rar

57.45 KB, 阅读权限: 2

沙发
skygrow| | 2011-2-15 10:59 | 只看该作者
Fcy=Fosc/2=20M/2=10M
Tcy=1/Fcy=100ns

使用特权

评论回复
板凳
isbit|  楼主 | 2011-2-15 11:39 | 只看该作者
谢谢楼上,
但是图片例子:8M的晶振,算出来的是TCY=TCY/2=62.5ns

使用特权

评论回复
地板
yewuyi| | 2011-2-15 13:54 | 只看该作者
8M的时候可能又做了PLL倍频。

20M的时候,可能不支持PLL倍频。

使用特权

评论回复
5
skygrow| | 2011-2-15 14:16 | 只看该作者
图片例子4倍频了,32Mhz

使用特权

评论回复
6
yewuyi| | 2011-2-15 14:48 | 只看该作者
图片例子4倍频了,32Mhz
skygrow 发表于 2011-2-15 14:16


20M晶体的时候,可能不支持倍频

使用特权

评论回复
7
isbit|  楼主 | 2011-2-15 15:22 | 只看该作者
谢谢二位,我再仔细分析一下;
pic还不熟;
2011发大财

使用特权

评论回复
8
isbit|  楼主 | 2011-2-15 16:40 | 只看该作者
谢谢,明白了如何计算,但是误差很大,什么原因呢?

pwm周期=(PR2+1)*TCY*(Timer2预分频值)
pwm周期=1061*100ns*1
pwm周期=106us  
而实际示波器测出的pwm 周期
160us  误差太大了;

使用特权

评论回复
9
yewuyi| | 2011-2-15 17:05 | 只看该作者
谢谢,明白了如何计算,但是误差很大,什么原因呢?

pwm周期=(PR2+1)*TCY*(Timer2预分频值)
pwm周期=1061*100ns*1
pwm周期=106us  
而实际示波器测出的pwm 周期
160us  误差太大了; ...
isbit 发表于 2011-2-15 16:40


你确定PR2?TCY?以及分频值在计算时都是正确的吗?!
另外,你可以用示波器看看你的20M晶体的频率到底是多少。

使用特权

评论回复
10
isbit|  楼主 | 2011-2-15 17:16 | 只看该作者
本帖最后由 isbit 于 2011-2-15 17:24 编辑

hi,叶公:
1:按skygrow的tcy的计算方法(无倍频分频):
Fcy=Fosc/2=20M/2=10M
Tcy=1/Fcy=100ns

2:PR2=1060 是我直接赋值的;
3:20M晶体 示波器测的很精准;

我再看看 PR2=1060,是不是溢出了;
PR2 16bit 不会溢出的;

使用特权

评论回复
11
Mary_luo| | 2011-2-15 22:24 | 只看该作者
讨论气氛好热烈啊,鼓掌!:)

使用特权

评论回复
12
yewuyi| | 2011-2-16 10:07 | 只看该作者
谢谢,明白了如何计算,但是误差很大,什么原因呢?

pwm周期=(PR2+1)*TCY*(Timer2预分频值)
pwm周期=1061*100ns*1
pwm周期=106us  
而实际示波器测出的pwm 周期
160us  误差太大了; ...
isbit 发表于 2011-2-15 16:40



请上图。

使用特权

评论回复
13
skygrow| | 2011-2-16 10:27 | 只看该作者
软仿真了下,这个程序的PWM周期为1060左右Tcy,
贴出你的示波器图来,看看PWM周期怎么测得,如果一个周期里两个高电平,一个低电平的话,周期为1600左右Tcy

使用特权

评论回复
14
isbit|  楼主 | 2011-2-16 14:24 | 只看该作者
本帖最后由 isbit 于 2011-2-18 14:43 编辑

hi,skygrow 波形图:

jingzhen.jpg (99.75 KB )

20M晶振波形

20M晶振波形

使用特权

评论回复
15
yewuyi| | 2011-2-17 09:05 | 只看该作者
1、重点检查配置字、程序中有关PLL、分频器等部分,我看PIC24FJ64GA004手册中明确些了震荡频率最高不超过32M,但你的代码部分好像又把20M做了PLL倍频,看你的注释好像搞到了96M !?
2、你给出的手册为PIC24FJ64GA004,但你项目中设置的芯片型号却是GB002 !?

这样的问题,还是自己好好看手册慢慢查比较好,别人除非特别有空,才会给你一点一点查。

使用特权

评论回复
16
isbit|  楼主 | 2011-2-17 09:39 | 只看该作者
叶公:谢谢,我再仔细查查什么原因;---我想彻底搞懂它
1:
_CONFIG2( FNOSC_PRIPLL & POSCMOD_HS )  //& PLL96MHZ_ON & PLLDIV_DIV5 )
PLL倍频我已经注释掉了;

2:PLL计算方法用PIC24FJ64GA004和PIC24FJ64GB004一样的,PIC24FJ64GA004是中文的;
   实际项目是PIC24FJ64GB002

使用特权

评论回复
17
skygrow| | 2011-2-17 15:28 | 只看该作者
LZ再查查看
用了你的程序PIC24FJ64GB004上跑了,8MHZ晶振没有PLL示波器测出PWM频率3.77K
符合1061*0.25us=265us
提醒一下, RB13和AD复用,请关掉AD功能

使用特权

评论回复
18
isbit|  楼主 | 2011-2-18 16:10 | 只看该作者
谢谢,ls,不用PLL,测试已经ok了;

106k_副本.jpg (135.1 KB )

106k_副本.jpg

使用特权

评论回复
19
doob| | 2011-4-18 11:01 | 只看该作者
不知道如果设置 PLL功能,pwm如何计算?

使用特权

评论回复
20
qzhui121| | 2011-5-24 15:54 | 只看该作者
结论如何》》》???!!

使用特权

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

本版积分规则

194

主题

963

帖子

1

粉丝