久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2455|回復: 5
收起左側

怎么用msp430f5529產生4組帶死區(qū)時間的互補的pwm波,求大神賜教啊

[復制鏈接]
ID:349665 發(fā)表于 2019-7-15 18:34 | 顯示全部樓層 |閱讀模式
如題
回復

使用道具 舉報

ID:631373 發(fā)表于 2019-10-28 14:04 | 顯示全部樓層
有解決嗎,我也在研究,不過現在只研究回來兩路的,四路還沒搞定,希望可以一起討論
回復

使用道具 舉報

ID:631355 發(fā)表于 2019-10-28 15:19 | 顯示全部樓層
就用兩個定時器,中間通過延時控制死區(qū)
回復

使用道具 舉報

ID:631355 發(fā)表于 2019-10-28 15:20 | 顯示全部樓層
static char TAPwmInit(char Clk,char Div,char Mode1,char Mode2,char Mode3,char Mode4)
{
    TBCTL = 0;                  //清除以前設置
    TBCTL |= MC_1;              //定時器TA設為增計數模式  
    switch(Clk)                 //選擇時鐘源
    {
        case 'A': case 'a':  TBCTL|=TBSSEL_1; break;    //ACLK
        case 'S': case 's':  TBCTL|=TBSSEL_2; break;    //SMCLK
        case 'E':            TBCTL|=TBSSEL_0; break;    //外部輸入(TACLK)
        case 'e':            TBCTL|=TBSSEL_3; break;    //外部輸入(TACLK取反)
        default :  return(0);                           //參數有誤
    }
    switch(Div)                 //選擇分頻系數
    {
        case 1:   TBCTL|=ID_0; break;   //1
        case 2:   TBCTL|=ID_1; break;   //2
        case 4:   TBCTL|=ID_2; break;   //4
        case 8:   TBCTL|=ID_3; break;   //8
        default :  return(0);           //參數有誤
    }
    switch(Mode1)               //設置PWM通道1的輸出模式。
    {
        case 'P':case 'p':          //如果設置為高電平模式
            TBCCTL1 = OUTMOD_7;     //高電平PWM輸出
            P4SEL |= BIT1;          //從P1.2輸出 (不同型號單片機可能不一樣)
            P4DIR |= BIT1;          //從P1.2輸出 (不同型號單片機可能不一樣)              
            break;
        case 'N':case 'n':          //如果設置為低電平模式         
            TBCCTL1 = OUTMOD_3;     //低電平PWM輸出
            P4SEL |= BIT1;          //從P1.2輸出 (不同型號單片機可能不一樣)
            P4DIR |= BIT1;          //從P1.2輸出 (不同型號單片機可能不一樣)               
            break;
        case '0':case 0:            //如果設置為禁用         
            P4SEL &= ~BIT1;         //P1.2恢復為普通IO口              
            break;                 
        default :  return(0);       //參數有誤
    }
    switch(Mode2)                   //設置PWM通道1的輸出模式。
    {
        case 'P':case 'p':          //如果設置為高電平模式
            TBCCTL2 =OUTMOD_7;      //高電平PWM輸出
            P4SEL |= BIT2;          //從P1.3輸出 (不同型號單片機可能不一樣)
            P4DIR |= BIT2;          //從P1.3輸出 (不同型號單片機可能不一樣)
            break;
        case 'N':case 'n':          //如果設置為低電平模式         
            TBCCTL2 =OUTMOD_3;      //低電平PWM輸出
            P4SEL |= BIT2;          //從P1.3輸出 (不同型號單片機可能不一樣)  
            P4DIR |= BIT2;          //從P1.3輸出 (不同型號單片機可能不一樣)              
            break;
        case '0':case 0:            //如果設置為禁用         
            P4SEL &= ~BIT2;         //P1.3恢復為普通IO口              
            break;                 
        default :  return(0);       //參數有誤
    }
    switch(Mode3)                   //設置PWM通道3的輸出模式。
    {
        case 'P':case 'p':          //如果設置為高電平模式
            TBCCTL3 =OUTMOD_7;      //高電平PWM輸出
            P4SEL |= BIT3;          //從P1.3輸出 (不同型號單片機可能不一樣)
            P4DIR |= BIT3;          //從P1.3輸出 (不同型號單片機可能不一樣)
            break;
        case 'N':case 'n':          //如果設置為低電平模式         
            TBCCTL3 =OUTMOD_3;      //低電平PWM輸出
            P4SEL |= BIT3;          //從P1.3輸出 (不同型號單片機可能不一樣)  
            P4DIR |= BIT3;          //從P1.3輸出 (不同型號單片機可能不一樣)              
            break;
        case '0':case 0:            //如果設置為禁用         
            P4SEL &= ~BIT3;         //P1.3恢復為普通IO口              
            break;                 
        default :  return(0);       //參數有誤
    }
        switch(Mode4)                   //設置PWM通道4的輸出模式。
    {
        case 'P':case 'p':          //如果設置為高電平模式
            TBCCTL4 =OUTMOD_7;      //高電平PWM輸出
            P4SEL |= BIT4;          //從P1.3輸出 (不同型號單片機可能不一樣)
            P4DIR |= BIT4;          //從P1.3輸出 (不同型號單片機可能不一樣)
            break;
        case 'N':case 'n':          //如果設置為低電平模式         
            TBCCTL4 =OUTMOD_3;      //低電平PWM輸出
            P4SEL |= BIT4;          //從P1.3輸出 (不同型號單片機可能不一樣)  
            P4DIR |= BIT4;          //從P1.3輸出 (不同型號單片機可能不一樣)              
            break;
        case '0':case 0:            //如果設置為禁用         
            P4SEL &= ~BIT4;         //P1.3恢復為普通IO口              
            break;                 
        default :  return(0);       //參數有誤
    }  
    return(1);  
}

static void TAPwmSetPeriod(unsigned int Period)
{
    TBCCR0 = Period;
    TBCCR1 = Period;
    TBCCR2 = Period;
    TBCCR3 = Period;
    TBCCR4 = Period;
}

static void TAPwmSetDuty(char Channel,unsigned int Duty)
{
    switch(Channel)
    {
        case 1: TBCCR1=Duty; break;
        case 2: TBCCR2=Duty; break;
        case 3: TBCCR3=Duty; break;
        case 4: TBCCR4=Duty; break;
    }
}

static void TAPwmSetPermill(char Channel,unsigned int Percent)
{
    unsigned long int Period;
    unsigned int Duty;
    Period = TBCCR0;
    Duty = Period * Percent / 1000;
    TAPwmSetDuty(Channel,Duty);
}

void pwm_init(void)
{
  TAPwmInit('A',2,'P','P','P','P');   //將定時器TA初始化成為PWM發(fā)生器
  TAPwmSetPeriod(1000);        //通道1/2的PWM方波周期均設為500個時鐘周期
}

void pwm_set(unsigned char sta,unsigned char dir,unsigned int pwm_in,unsigned int pwm_out)
{
    if((1 == sta) && (1 == dir))
    {
            TAPwmInit('A',2,'0','0','N','P');
            TAPwmSetPermill(3,(pwm_out-2));     //2通道 20.0%
            TAPwmSetPermill(4,(pwm_out));     //2通道 20.0%   
            P4OUT |=BIT1;  //   1
            //P4OUT&=~BIT1;  //   0
            //P4OUT |=BIT2;  //   1
            P4OUT&=~BIT2;  //   0
            //P4OUT |=BIT3;  //   1
            //P4OUT&=~BIT3;  //   0
            //P4OUT |=BIT4;  //   1
            //P4OUT&=~BIT4;  //
    }
    else if((1 == sta) && (0 == dir))
    {
            TAPwmInit('A',2,'N','P','0','0');
            TAPwmSetPermill(1,(pwm_in-2));     //2通道 20.0%
            TAPwmSetPermill(2,(pwm_in));     //2通道 20.0%
            //P4OUT |=BIT1;  //   1
            //P4OUT&=~BIT1;  //   0
            //P4OUT |=BIT2;  //   1
            //P4OUT&=~BIT2;  //   0
            P4OUT |=BIT3;  //   1
            //P4OUT&=~BIT3;  //   0
            //P4OUT |=BIT4;  //   1
            P4OUT&=~BIT4;  //   0
    }
    else if(0 == sta)
    {
            TAPwmInit('A',2,'0','0','0','0');
            P4OUT |=BIT1;  //   1
            //P4OUT&=~BIT1;  //   0
              
            //P4OUT |=BIT2;  //   1
            P4OUT&=~BIT2;  //   0
              
            //P4OUT |=BIT3;  //   1
            P4OUT&=~BIT3;  //   0
              
            //P4OUT |=BIT4;  //   1
            P4OUT&=~BIT4;  //   0   
    }
    else {};
  
}
回復

使用道具 舉報

ID:631355 發(fā)表于 2019-10-28 15:21 | 顯示全部樓層
如果硬件不支持的死區(qū)設定,你可以做個修正值delta,加在每一路duty設置上。如果不夠精細,可以每一路單獨設一個修正值。
但是前沿和后沿想單獨設定的話,就不太容易。
回復

使用道具 舉報

ID:631355 發(fā)表于 2019-10-28 15:24 | 顯示全部樓層
430本身不帶硬件死區(qū),有一種方法可以做類似功能
如下圖,采用updown計數模式,用中心對其的方式可以做出一個死區(qū)
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日本午夜免费福利视频 | 一区中文字幕 | 久久亚洲一区二区三区四区 | 久久天天躁狠狠躁夜夜躁2014 | 黄色网址在线播放 | 亚洲视频 欧美视频 | 一区二区三区视频在线免费观看 | 请别相信他免费喜剧电影在线观看 | 国产一级特黄真人毛片 | 中文字幕在线观看一区 | 福利社午夜影院 | 日韩在线免费视频 | 亚洲视频免费观看 | 久久精品国产一区二区电影 | 中文字幕 在线观看 | 欧美一区二区在线播放 | 日韩精品一区二区三区中文字幕 | 日韩视频精品在线 | 国产伦精品一区二区三区高清 | 欧美视频在线播放 | www亚洲免费国内精品 | 国产激情在线播放 | 国产高清在线观看 | 日韩高清中文字幕 | 一区二区三区精品 | 黄色日批视频 | 在线观看亚洲一区二区 | 黄色福利 | 成人夜晚看av | 一级做a| 91电影院| 在线电影日韩 | 视频一区在线播放 | 精品国产乱码久久久久久图片 | 亚洲精品美女视频 | 99精品视频免费观看 | 日韩一级免费观看 | 欧美中文字幕一区二区三区 | 天天干天天爽 | 精品日韩一区 | 日韩高清一区 |