打印

动态分配PWM的两个通道。

[复制链接]
1565|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wazhzlp|  楼主 | 2012-12-22 17:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 wazhzlp 于 2012-12-24 10:17 编辑

硬件配置。//------------------------------------





----------------
// C main line
//----------------------------------------------------------------------------

#include <m8c.h>        // part specific constants and macros
#include "PSoCAPI.h"    // PSoC API definitions for all User Modules
#pragma interrupt_handler    timer;
#define PWM1L        0X04        //P1.2
#define PWM1H        0X08        //P1.3
#define PWM2L        0X20        //P1.5
#define PWM2H        0X10        //P1.4
#define PWM3L        0X40        //P1.6
#define PWM3H        0X80        //P1.7
#define    led    0x02        //P0.1

char i,n,m,port1_value;

void    timer()
{
Timer8_1_Stop();
// LED_1_Invert();
i++;
  if(i==100){i=0;}
  if(i==99)
  {
    m=m+10;
    if(m==180){m=20;}
    n++;
    if(n==7){n=1;}
    PRT0DR=PRT0DR | led;//led    on                 
    PWMDB8_1_WritePulseWidth(m);
               }
  if(i!=99){PRT0DR=PRT0DR &(~led);}//led    off
Timer8_1_WritePeriod(200);
Timer8_1_Start();

}

//enable PWM function
void Enable_PWM(char pin_value)
{        
    PRT1GS = PRT1GS | pin_value;
    PRT1DM0 = PRT1DM0 | pin_value;
}

//disable PWM function
void Disable_PWM(char pin_value)
{
    pin_value = ~pin_value;
    port1_value = port1_value & pin_value;
    PRT1DR = port1_value;              
    PRT1GS = PRT1GS & pin_value;
    PRT1DM0 = PRT1DM0 & pin_value;
}

//Turn PWM always on
void PWM_ON(char pin_value)
{
    port1_value = port1_value | pin_value;
    PRT1DR = port1_value;
    PRT1GS = PRT1GS & (~pin_value);
    PRT1DM0 = PRT1DM0 | pin_value;     
}

//Turn PWM always off
void PWM_OFF(char pin_value)
{
    port1_value = port1_value &(~pin_value);
    PRT1DR = port1_value;
    PRT1GS = PRT1GS &(~pin_value);
    PRT1DM0 = PRT1DM0 | pin_value;     
}


void Disable_PWMs(char port1)
{
    port1 = ~port1;
    port1_value = port1_value & port1;
    PRT1DR = port1_value;
    PRT1GS = PRT1GS & port1;
    port1 = ~port1;   
    PRT1DM0 = PRT1DM0 | port1;
}




void main()
{
    // Insert your main routine code here.
    i=0;
    n=0;
    m=100;
   // PRT0GS =PRT0GS & (~pwm1) & (~pwm2) & (~led);//p0
    //PRT0DM0 = PRT0DM0 | led | pwm1 | pwm2;
    //PRT1GS =PRT1GS & (~pwm3) & (~pwm4) & (~pwm5) & (~pwm6);//p1
    //PRT1DM0 = PRT1DM0 | pwm3 | pwm4 | pwm5 | pwm6;
   
    M8C_EnableGInt;
    Timer8_1_Start();
    Timer8_1_EnableInt();
   
    PWMDB8_1_Start();
   
    while(1)
    {
   
    // if(n==6){n=0;}

     
     
      switch(n)
    {
     case 1: //2
            Disable_PWMs(PWM1L|PWM2H|PWM2L|PWM3H);         
             Enable_PWM(PWM1H);   
             Enable_PWM(PWM3L);
             //sector = 0;                 
             break;
     case 6: //a
            Disable_PWMs(PWM1H|PWM1L|PWM2L|PWM3H);                  
             Enable_PWM(PWM2H);
             Enable_PWM(PWM3L);   
             //sector = 1;            
             break;
     case 5: //8
            Disable_PWMs(PWM1H|PWM2L|PWM3H|PWM3L);                  
             Enable_PWM(PWM2H);
             Enable_PWM(PWM1L);   
             //sector = 2;            
             break;
     case 4: //0x28
            Disable_PWMs(PWM1H|PWM2H|PWM2L|PWM3L);                  
             Enable_PWM(PWM3H);
             Enable_PWM(PWM1L);   
             //sector = 3;            
             break;
     case 3: //0x20
            Disable_PWMs(PWM1H|PWM1L|PWM2H|PWM3L);                  
             Enable_PWM(PWM3H);
             Enable_PWM(PWM2L);
             //sector = 4;         
             break;   
     case 2: //0x22
            Disable_PWMs(PWM1L|PWM2H|PWM3H|PWM3L);
             Enable_PWM(PWM1H);
             Enable_PWM(PWM2L);
             //sector = 5;
             break;                     
     default:
             Disable_PWMs(PWM1H|PWM1L|PWM2H|PWM2L|PWM3H|PWM3L);   
             break;   
     }
   
   
   
    }
   
   
}



这个程序是网上下载的动态分配pwm的2路到6个IO口。但是我始终没有跳出来。不知道为什么。请大家解答。

沙发
hongong| | 2012-12-25 17:37 | 只看该作者
等高手

使用特权

评论回复
板凳
Go_PSoC| | 2012-12-26 11:04 | 只看该作者
帮你顶,哪位帮着看看?

使用特权

评论回复
地板
PSoC小子| | 2012-12-26 12:45 | 只看该作者
代码乱七八糟的,

楼主就说说你想实现什么功能吧

使用特权

评论回复
5
wazhzlp|  楼主 | 2012-12-26 13:46 | 只看该作者
代码没有什么问题,只是写法有点不太规范。其实这个问题我已经自己解决,问题就是:实现pwm的两个通道的复用。






这样只要在不同的时候开关端口就可以了。就像我在那个帖子里问的PRTXGS的问题一样。这个问题我自己解决了。
不知道是不是有更加好的方法,这是我的代码:

#include <m8c.h>        // part specific constants and macros
#include "PSoCAPI.h"    // PSoC API definitions for all User Modules
#define PWM1L        0X20        //P1.5
#define PWM1H        0X80        //P1.7
#define PWM2L        0X10        //P1.4
#define PWM2H        0X40        //P1.6
#define PWM3L        0X02        //P1.1
#define PWM3H        0X04        //P1.3
#pragma interrupt_handler PWMDB8_1_ISR   //定义PWMDB8_1_ISR为pwmdb8的中断服务子函数。
char  i,HALL_PHASE,port1_value,pin_value;
void LED_FLASH(void);
void main(void)
{
    HALL_PHASE=0;
    LED_1_Start();
    M8C_EnableGInt;
    PWMDB8_1_Start();
    PWMDB8_1_EnableInt();
    //LED_FLASH();

    while(1)
        {
            

            switch(HALL_PHASE)
            {
     case 1: //2
            Disable_PWMs(PWM1L|PWM2H|PWM2L|PWM3H);
             Enable_PWM(PWM1H);
             Enable_PWM(PWM3L);
             //sector = 0;
             break;
     case 6: //a
            Disable_PWMs(PWM1H|PWM1L|PWM2L|PWM3H);
             Enable_PWM(PWM2H);
             Enable_PWM(PWM3L);
             //sector = 1;
             break;
     case 5: //8
            Disable_PWMs(PWM1H|PWM2L|PWM3H|PWM3L);
             Enable_PWM(PWM2H);
             Enable_PWM(PWM1L);
             //sector = 2;
             break;
     case 4: //0x28
            Disable_PWMs(PWM1H|PWM2H|PWM2L|PWM3L);
             Enable_PWM(PWM3H);
             Enable_PWM(PWM1L);
             //sector = 3;
             break;
     case 3: //0x20
            Disable_PWMs(PWM1H|PWM1L|PWM2H|PWM3L);
             Enable_PWM(PWM3H);
             Enable_PWM(PWM2L);
             //sector = 4;
             break;
     case 2: //0x22
            Disable_PWMs(PWM1L|PWM2H|PWM3H|PWM3L);
             Enable_PWM(PWM1H);
             Enable_PWM(PWM2L);
             //sector = 5;
             break;
     default:
             Disable_PWMs(PWM1H|PWM1L|PWM2H|PWM2L|PWM3H|PWM3L);
             break;
            }

        }
}


//中断服务子函数
//code begin
void PWMDB8_1_ISR(void)
{
        i++;

}
//void LED_FLASH(void)
//{
    //if(i==100)
     //   {
     //           LED_1_Invert();
      //          i=0;
     //   }
////code end


//  开某个端口的PWM
//code begin
void Enable_PWM(char pin_value)
{
    PRT1GS = PRT1GS | pin_value;
    PRT1DM0 = PRT1DM0 | pin_value;
}
//code end



//批量关闭PWMS
//code begin
void Disable_PWMs(char port1)
{
    port1 = ~port1;
    port1_value = port1_value & port1;
    PRT1DR = port1_value;
    PRT1GS = PRT1GS & port1;
    port1 = ~port1;
    PRT1DM0 = PRT1DM0 | port1;
}
//code begin

使用特权

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

本版积分规则

13

主题

51

帖子

1

粉丝