打印

30f2010芯片的电机PWM模块驱动问题

[复制链接]
6707|24
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
kindwyw|  楼主 | 2011-5-18 20:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请问论坛的同仁们,我用30F2010电机控制模块功能来做逆变电源全桥驱动,具体PWM控制程序如下,调试可通过,但是烧到片子里去,用示波器测无PWM波形,PWML控制口一直是高电平,PWMH一直是低电平,请大家耐心一起探讨看看是否程序问题,谢谢!
**********************************************/
#include"p30f2010.h"
#include<stdio.h>
#define uint unsigned int
#define uchar unsigned char
#define RB0 PORTB,0
#define RD0 PORTD,0
uint rec_counter,kgbzw,pwmbzw,spwmbzw,adval;
//_FOSC(0x000303);
_FBORPOR(0x000201);
/*****************PWM 初始化子程序 *******************************/
void init_PWM()
{
     INTCON1bits.NSTDIS=1    ;   //中断嵌套禁止
     INTCON2bits.ALTIVT=0    ;   //使用标准向量表(默认)
     IPC9=0x6000            ;   //电机脉宽调制中断优先控制等级为6
     IPC10=0x7000           ;   //故障A输入中断优先等级7
     
     PTCON=0x7000            ;   /*PWM时基控制寄存器*/
     PTMR=0x0000             ;   //PWM时基寄存器,0-14bit为时基寄存器记数值
     PTPER=50                ;   //PWM时基周期寄存器,20KHz(50uS)
     SEVTCMP=0x0000          ;   //特殊事件比较寄存器
     PWMCON1=0x00FF          ;   //PWMxH,PWMxL使能为互补输出模式
     PWMCON2=0x0002          ;   //控制寄存器2
     DTCON1=0x3FF            ;   //死区时间控制寄存器1
    //DTCON2=0X000F          ;   //死区时间控制寄存器2
     FLTACON=0X008F          ;   //故障A控制寄存器
    //FLTBCON=0X008F         ;   //故障B控制寄存器
     OVDCON=0XFFFF           ;   //改写控制寄存器
     PDC1=50                 ;   //PWM占空比寄存器1,为50
     PDC2=50                 ;   //PWM占空比寄存器2,为50
     PDC3=50                 ;
     OC1CON=0x0000           ;    //关闭比较器输出
     PTCON=0X8000            ;   //PWM启动     
}
/****************************AD中断服务程序*************************/
void __attribute__((interrupt,no_auto_psv)) _adjInterrupt()
{
        uint adval;
     float advalf;
        IFS0bits.ADIF=0   ;
        adval=ADCBUF0;
     //adval=adval<<8|ADRESL;
     //advalf=adval/1023.0*5.0;
    // adval=advalf*1000;     
    return (adval)  ;                     
}
/*****************************延时程序***********************************/
void delay(uint x)
{
uint a,b;
for(a=x;a>0;a--)
  for(b=110;b>0;b--);
}
/*********************************I/O初始化************************/
void init_io()
{
     TRISB=0x003F;
     TRISC=0xE000;
     TRISD=0x0003;
     TRISE=0x0000;
     TRISF=0x000C;
     
     PORTB=0;
     PORTC=0;
     PORTD=0;
     PORTE=0;
     PORTF=0;
}
/*****************************PWM调节*****************************/
void pwm_adj(void)
{
   // if(kgbzw)                 //判断kgbzw=1?
// {
   //   if(pwmbzw)
    //   {
         PTPER=adval ;
     //  }  
     //    if(spwmbzw)
      //    {
      //     PDC1=rec_counter ;  
      //     PDC2=rec_counter ;               
      //     PDC3=rec_counter ;
        //  }  
  //}
}
/****************************ad 模块初始化******************************/
void init_adc(void)
{
    ADPCFG=0xFFFE;           // 将端口B的RB0配置为模拟引脚
    //ADCON1=0x8000;          // A/D转换器模块启动
    ADCON2=0x0000;           // 每没完成一个采样/转换后产生中断
    ADCON3=0x0080;           // 转换时钟(Tad)来源于内部RC
    ADCHS=0x0000;            //AD通道选择AN0
    IFS0bits.ADIF=0;         
    IEC0bits.ADIE=1;
    ADCON1bits.ADON=1;       //A/D转换器模块启动
}
/***************** MAIN ROUTINE(主程序)**************************/
int main()
{
    TRISEbits.TRISE0=0;       //设置RE0-RE3为输出8、
    TRISEbits.TRISE1=0;
    TRISEbits.TRISE2=0;
    TRISEbits.TRISE3=0;
   
    LATEbits.LATE0=0;
    LATEbits.LATE1=0;
    LATEbits.LATE2=0;
    LATEbits.LATE3=0;
   
    init_io();
    init_PWM();
   // init_UART();
    init_adc();
    while(1)
    {
      //start();
      pwm_adj();
     // pro();
    }   
}
沙发
yewuyi| | 2011-5-19 08:50 | 只看该作者
打开PWM端口了吗?

使用特权

评论回复
板凳
yewuyi| | 2011-5-19 09:03 | 只看该作者
我记得的是:

PWM端口的方向控制位请关闭掉,PWM模块会自己根据占空比自动打开或者关闭它的。

使用特权

评论回复
地板
XIEYUANBIN| | 2011-5-19 10:58 | 只看该作者
不知道你调试什么了,怎么调试的?
dsPIC的PWM输出控制比较复杂,配置位可以定义PWM输出脚在复位的时候受普通IO口程序控制还是受PWM控制器控制,并且可以定义PWM输出是高电平有效还是低电平有效,所以你在配置字里一定要定义好.

使用特权

评论回复
5
kindwyw|  楼主 | 2011-5-19 21:05 | 只看该作者
PWM端口打开了,PWMCON1寄存器设置的同时应该相应PWM端口的IO方向控制关闭了吧,同时我是用软件仿真的,相应积存器变化都正常,就是PORTE口一直是0X0015无变化,所以没有PWM波形输出,请问电机驱动模块输出,是不是当PTMR和PTPER匹配时进入中断,所以要增加个中断函数同时在中断子程序里重新启动PTCON时基,求解

使用特权

评论回复
6
XIEYUANBIN| | 2011-5-20 09:19 | 只看该作者
配置位需要设置,烧写时的问题,不是编程的问题

使用特权

评论回复
7
kindwyw|  楼主 | 2011-5-20 11:06 | 只看该作者
楼上兄弟,请看我配置是否有问题 ,谢谢,具体如下:
30F2010烧写配置
FPR     Primary  Oscillator  Mode         HS
FOS     Oscillator Source                 Primary  Oscillator
FCKMEN  Clock Switching adn Monitor       Sw Enabled,Mon Enabled
FWPSB   WDT Prescaler B                   1:16
FWPSA   WDT prescaler A                   1:512
WDT     Watchdog Timer                    Dsiable
FPWRT   POR Timer Value                   4ms
BORENV  Brown  Out Voltage                4.5V
BOREN   PBOR Enable                       Disabled
LPOL    Low-side  PWM  Output Polarity    Active High
HPOL    High-side PWM  Output Polarit     Acitve High
PWMPIN  PWM Output Pin Reset              Control with HPOL/LPOL bits
MCLRE   Master Clear  Enable              Disabled
GWRP    General  Code Segment Write       Disabled
GCP     General  Segment Code Protect     Disabled
ICS     Comm  Channel  Select             Use PGC/EMUC and PGD/EMUD

使用特权

评论回复
8
XIEYUANBIN| | 2011-5-20 14:55 | 只看该作者
你选的是Control with HPOL/LPOL bits
那么请参考OVDCON 的值的设置.

使用特权

评论回复
9
kindwyw|  楼主 | 2011-5-20 16:12 | 只看该作者
楼上的兄弟,我选Control with  PORT/TRIS regs或改OVDCON=0XFFFF为0x0000,也不可以,烦请再看看 ,谢谢!

使用特权

评论回复
10
kindwyw|  楼主 | 2011-5-20 16:42 | 只看该作者
谢谢XUETYABIN大师的指点,现在有PWM输出了,按你说的配置搞定了,再次感谢!

使用特权

评论回复
11
kindwyw|  楼主 | 2011-5-23 21:01 | 只看该作者
再问,请问ICD2可以直接仿真DSPIC30F的片子不?我的仿真不了,郁闷!

使用特权

评论回复
12
XIEYUANBIN| | 2011-5-24 13:24 | 只看该作者
可以是可以,但不能支持2010的PLL倍频, 你只能用内部或外部振荡的频率来仿真.需用30F4xxx以上的片子才行.

使用特权

评论回复
13
kindwyw|  楼主 | 2011-5-24 15:45 | 只看该作者
能具体说说吗?在线等,谢谢!

使用特权

评论回复
14
XIEYUANBIN| | 2011-5-24 16:44 | 只看该作者
由于DSPIC30F3xxx之前的产品,PLL要在烧写或读取后要重新上电PLL才能起作用,所以在仿真时由于频繁被ICD2读取,读取后你又不能重新上电,PLL不能倍频,工作频率始终在没有倍频的情况,但仿真还是可以仿真的.只不过运行速度只有你的目标值的1/倍频,你与时钟有关的都是要计算没倍频的情况.

使用特权

评论回复
15
kindwyw|  楼主 | 2011-5-24 19:10 | 只看该作者
恩,是可以仿真,就是慢,谢谢您

使用特权

评论回复
16
kindwyw|  楼主 | 2011-5-24 22:15 | 只看该作者
再请教,我上面程序是调试只有一个口有PWM波形输出,且周期不能调,设置OVDCON和PTPER都不管用,也不懂问题在那,DSP电机输出PWM设置还需要注意那些,我是想互补输出模式,请XUE大侠再帮忙分析,谢谢!

使用特权

评论回复
17
kindwyw|  楼主 | 2011-5-26 13:43 | 只看该作者
XIEYUANBIN大侠在不?

使用特权

评论回复
18
XIEYUANBIN| | 2011-5-26 13:52 | 只看该作者
PWMCON1,PTCON,的设置?周期由PTPER控制,你自己仔细看看那些寄存器的功能.

使用特权

评论回复
19
kindwyw|  楼主 | 2011-5-31 15:03 | 只看该作者
设置应该没问题的,PTPEN数值改了,周期也不会变化

使用特权

评论回复
20
chenjian_axyz| | 2011-6-29 16:20 | 只看该作者
10# kindwyw 你好,我遇到同样的问题,不知道你是什么解决的。谢谢

使用特权

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

本版积分规则

21

主题

55

帖子

2

粉丝