打印

NUC100 pwm诡异

[复制链接]
2998|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
formatmd|  楼主 | 2010-10-21 10:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
void init_pwm_tiaokuan(INT16U g_u16Frequency01)
{
  S_DRVPWM_TIME_DATA_T_TiaoKuan sPt01;
  // Enable PWM clock //
DrvPWM_Open();
HWREG(0x50000030)|=0x00001000; //GPA_MFP的12位 设置PA12为PWM0
UNLOCKREG();
DrvSYS_SetHCLKSource(0); //外部晶振
LOCKREG();
sPt01.u8Mode = DRVPWM_TOGGLE_MODE;
sPt01.u32Frequency = g_u16Frequency01;//g_u16Frequency;
sPt01.u32HighPulseRatio = 50; // High Pulse peroid : Total Pulse peroid = 1 : 100 //
sPt01.i32Inverter = 0;
// Select PWM engine clock //
// DrvPWM_SelectClockSource(DRVPWM_TIMER0, DRVPWM_HCLK);
HWREG(0x50000208)|=0x00100000;//APBCLK PWM01EN=1
// DrvPWM_SetTimerClk_TiaoKuan(DRVPWM_TIMER0,&sPt01);
HWREG(0x40040000)|=0x0000003f; //PPR
HWREG(0x40040004)|=0x00000004;//CSR time0输入,1分频
HWREG(0x40040008)|=0x00000004;//PCR 自动重装模式,PWM time0使能
HWREG(0x40040010)|=0x00003fff;//CMR 自动重装模式,PWM time0使能
HWREG(0x4004000C)|=0x0000fffe;//CNR 自动重装模式,PWM counter


//运行以下两句CMR CNR会清0
   //  DrvPWM_SetTimerIO(DRVPWM_TIMER0, 1);
HWREG(0x4004007C)|=0x00000001; //使能输出 POE03

// DrvPWM_Enable(DRVPWM_TIMER0, 1);
HWREG(0x40040008)|=0x00000001;//PCR PWM time0使能



}

想自己设置pwm宽度,有的地方没用库函数
调试时到
HWREG(0x4004007C)|=0x00000001; //使能输出 POE03
就会清CMR CNR
不知道那里出错

相关帖子

沙发
静默| | 2010-10-21 11:14 | 只看该作者
看了半天, 还真找不出哪里会出问题.

建议楼主, 新建一个工程, 然后仅把初始PWM部分代码加进去, 再加一个while(1)看看相应输出引脚是否输出自己需要的PWM. 当然也可用调试工具看一下寄存器值(最好用Memory方式看寄存器的值).

使用特权

评论回复
板凳
formatmd|  楼主 | 2010-10-21 14:56 | 只看该作者
void init_pwm_tiaokuan(INT16U TiaoKuan)
{        INT32U temp;
        S_DRVPWM_TIME_DATA_T_TiaoKuan sPt01;
        // Enable PWM clock //
        DrvPWM_Open();
        HWREG(0x50000030)|=0x00001000; //GPA_MFP的12位 设置PA12为PWM0
        UNLOCKREG();
        DrvSYS_SetHCLKSource(0); //外部晶振
        LOCKREG();

        sPt01.u8Mode = DRVPWM_TOGGLE_MODE;
        sPt01.u32Frequency = 1000;//g_u16Frequency;
        sPt01.u32HighPulseRatio = 50;        // High Pulse peroid : Total Pulse peroid = 1 : 100 //
        sPt01.i32Inverter = 0;

        // Select PWM engine clock //
        DrvPWM_SelectClockSource(DRVPWM_TIMER0, DRVPWM_HCLK);
        HWREG(0x50000208)|=0x00100000;//APBCLK PWM01EN=1

        DrvPWM_SetTimerClk_TiaoKuan(DRVPWM_TIMER0,&sPt01);

        temp=0;
        temp=HWREG(0x40040000)&0xffffff00;           //PPR
        temp=temp|0x01;
        HWREG(0x40040000)=temp;

        temp=0;
        temp=HWREG(0x40040004)&0xfffffffb;
        temp=temp|0x04;
        HWREG(0x40040004)=temp;                                 //CSR

//        HWREG(0x40040000)|=0x00000021; //PPR
//        HWREG(0x40040004)|=0x00000004;//CSR time0输入,1分频
//        HWREG(0x40040008)|=0x00000004;//PCR 自动重装模式,PWM time0使能
        temp=0;
        temp=HWREG(0x40040010)&0xffff0000;
        temp=temp|TiaoKuan;
    HWREG(0x40040010)=temp;//CMR 自动重装模式,PWM time0使能  65535

        temp=0;
        temp=HWREG(0x4004000C)&0xffff0000;
        temp=temp|65535;
        HWREG(0x4004000C)=temp;//CNR 自动重装模式,PWM counter           65535





   //  DrvPWM_SetTimerIO(DRVPWM_TIMER0, 1);
        HWREG(0x4004007C)|=0x00000001;        //使能输出        POE03


//        DrvPWM_Enable(DRVPWM_TIMER0, 1);
        HWREG(0x40040008)|=0x00000001;//PCR PWM time0使能







}
懒得去找原因了,
调用库再赋值
不会清,16位的调宽ok

使用特权

评论回复
地板
hotpower| | 2010-10-21 16:25 | 只看该作者
HWREG()实在晕!
难道没头文件?
还是为了优化代码?

使用特权

评论回复
5
X-Hawk| | 2010-10-21 17:34 | 只看该作者
本帖最后由 X-Hawk 于 2010-10-21 17:35 编辑

碰到过好多客户,不喜欢套用现成的软件bsp里的函数和代码。
其实那些例子代码整理的很干净的。
客户爱自己写,为什么呢??????

使用特权

评论回复
6
yybj| | 2010-10-21 18:17 | 只看该作者
可能觉得自己写比较清楚一点吧

使用特权

评论回复
7
formatmd|  楼主 | 2010-10-23 08:38 | 只看该作者
#define HWREG(x)                (*((volatile unsigned long *)(x)))
忘记写出宏定义了,
从TI的库函数复制过来的
库函数不是万能的,有时想实现自己要的功能,库里面没有,只有自己写的。
能拿来的,用的上的,决不会自己去写的,哈哈本人比较懒,

使用特权

评论回复
8
huzixian| | 2010-10-23 20:11 | 只看该作者
自己写思路比较清楚,用现成的出了问题也说不清楚

使用特权

评论回复
9
huzixian| | 2010-10-24 14:24 | 只看该作者
断点调试带你找出问题

使用特权

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

本版积分规则

2

主题

25

帖子

0

粉丝