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

[复制链接]
 楼主| 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

本帖子中包含更多资源

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

×
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倍频。
skygrow 发表于 2011-2-15 14:16 | 显示全部楼层
图片例子4倍频了,32Mhz
yewuyi 发表于 2011-2-15 14:48 | 显示全部楼层
图片例子4倍频了,32Mhz
skygrow 发表于 2011-2-15 14:16


20M晶体的时候,可能不支持倍频
 楼主| isbit 发表于 2011-2-15 15:22 | 显示全部楼层
谢谢二位,我再仔细分析一下;
pic还不熟;
2011发大财
 楼主| isbit 发表于 2011-2-15 16:40 | 显示全部楼层
谢谢,明白了如何计算,但是误差很大,什么原因呢?

pwm周期=(PR2+1)*TCY*(Timer2预分频值)
pwm周期=1061*100ns*1
pwm周期=106us  
而实际示波器测出的pwm 周期
160us  误差太大了;
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晶体的频率到底是多少。
 楼主| 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 不会溢出的;
Mary_luo 发表于 2011-2-15 22:24 | 显示全部楼层
讨论气氛好热烈啊,鼓掌!:)
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



请上图。
skygrow 发表于 2011-2-16 10:27 | 显示全部楼层
软仿真了下,这个程序的PWM周期为1060左右Tcy,
贴出你的示波器图来,看看PWM周期怎么测得,如果一个周期里两个高电平,一个低电平的话,周期为1600左右Tcy
 楼主| isbit 发表于 2011-2-16 14:24 | 显示全部楼层
本帖最后由 isbit 于 2011-2-18 14:43 编辑

hi,skygrow 波形图:

本帖子中包含更多资源

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

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

这样的问题,还是自己好好看手册慢慢查比较好,别人除非特别有空,才会给你一点一点查。
 楼主| isbit 发表于 2011-2-17 09:39 | 显示全部楼层
叶公:谢谢,我再仔细查查什么原因;---我想彻底搞懂它
1:
_CONFIG2( FNOSC_PRIPLL & POSCMOD_HS )  //& PLL96MHZ_ON & PLLDIV_DIV5 )
PLL倍频我已经注释掉了;

2:PLL计算方法用PIC24FJ64GA004和PIC24FJ64GB004一样的,PIC24FJ64GA004是中文的;
   实际项目是PIC24FJ64GB002
skygrow 发表于 2011-2-17 15:28 | 显示全部楼层
LZ再查查看
用了你的程序PIC24FJ64GB004上跑了,8MHZ晶振没有PLL示波器测出PWM频率3.77K
符合1061*0.25us=265us
提醒一下, RB13和AD复用,请关掉AD功能
 楼主| isbit 发表于 2011-2-18 16:10 | 显示全部楼层
谢谢,ls,不用PLL,测试已经ok了;

本帖子中包含更多资源

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

×
doob 发表于 2011-4-18 11:01 | 显示全部楼层
不知道如果设置 PLL功能,pwm如何计算?
qzhui121 发表于 2011-5-24 15:54 | 显示全部楼层
结论如何》》》???!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

196

主题

973

帖子

1

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