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

標(biāo)題: STC8A單片機(jī)輸出任意路(8路以內(nèi))同頻率同占空比不同相位的pwm波怎么實(shí)現(xiàn)啊?求指點(diǎn) [打印本頁(yè)]

作者: yjx156    時(shí)間: 2022-10-26 22:17
標(biāo)題: STC8A單片機(jī)輸出任意路(8路以內(nèi))同頻率同占空比不同相位的pwm波怎么實(shí)現(xiàn)啊?求指點(diǎn)
用定時(shí)器1查詢延時(shí)和中斷延時(shí)都試過(guò)了,示波器上顯示的都是相位一樣的PWM波。求大神指點(diǎn)。每路的相位差值是打算弄成(一個(gè)周期的時(shí)間/pwm路數(shù))。
PWM波是直接用STC8A上pwm寄存器生成的代碼如下(這個(gè)生成pwm波應(yīng)該沒(méi)有問(wèn)題示波器上顯示是正確的):
void PWM_init(int pin,long f,int pwm)  //PWM初始化函數(shù)
{
        switch(pin%10)
        {
                case 0:
                {
                        //STORE=P_SW2;
                        P_SW2 |= 0x80; //以下寄存器為擴(kuò)展sfr,訪問(wèn)前需先將PSW2寄存器最高位置1                        
                        PWMCKS = 0x0f;                              // PWM時(shí)鐘為系統(tǒng)時(shí)鐘/16 ,以適應(yīng)不同PWM頻率。   
                        PWMCFG = 0x00;                                                                                          //PWM配置寄存器,PWM無(wú)中斷,PWM不與ADC關(guān)聯(lián)
                        if(pin==10) PWM0CR=0x08;
                        if(pin==20) PWM0CR=0x00;
                        if(pin==60) PWM0CR=0x10;
                        PWM0_T = Main_Fosc16/f;                   //計(jì)算PWM一個(gè)周期總脈沖數(shù)(精度)
                        PWMC = PWM0_T;                        //設(shè)置PWM周期時(shí)鐘數(shù)
                        PWM0T1= (long)pwm*PWM0_T/10000;              //PWM0在計(jì)數(shù)值為15000地方輸出低電平
                        PWM0T2= 0;                             //PWM0在計(jì)數(shù)值為0地方輸出高電平                        
                        PWM0CR|=0x80;                          //使能PWM輸出
                        P_SW2  &= ~0x80;                       //PSW2寄存器最高位清0   
                        PWMCR  |= 0x80;   //使能PWM波形發(fā)生器,PWM計(jì)數(shù)器開(kāi)始工作
                        break;   //PWM0
                }
                case 1:
                {
                        //STORE=P_SW2;
                        P_SW2 |= 0x80; //以下寄存器為擴(kuò)展sfr,訪問(wèn)前需先將PSW2寄存器最高位置1                        
                        PWMCKS = 0x0f;                              // PWM時(shí)鐘為系統(tǒng)時(shí)鐘/16 ,以適應(yīng)不同PWM頻率。   
                        PWMCFG = 0x00;                                                                                          //PWM配置寄存器,PWM無(wú)中斷,PWM不與ADC關(guān)聯(lián)
                        if(pin==11) PWM1CR=0x08;
                        if(pin==21) PWM1CR=0x00;
                        if(pin==61) PWM1CR=0x10;
                        PWM1_T = Main_Fosc16/f;                   //計(jì)算PWM一個(gè)周期總脈沖數(shù)
                        PWMC = PWM1_T;                        //設(shè)置PWM周期時(shí)鐘數(shù)
                        PWM1T1= (long)pwm*PWM1_T/10000;              //PWM1在計(jì)數(shù)值為100H地方輸出低電平
                        PWM1T2= 0;                             //PWM1在計(jì)數(shù)值為700H地方輸出高電平                        
                        PWM1CR|=0x80;                          //使能PWM輸出
                        P_SW2  &= ~0x80;                       //PSW2寄存器最高位清0   
                        PWMCR  |= 0x80;   //使能PWM波形發(fā)生器,PWM計(jì)數(shù)器開(kāi)始工作
                        break;   //PWM1
                }
                case 2:
                {
                        //STORE=P_SW2;
                        P_SW2 |= 0x80; //以下寄存器為擴(kuò)展sfr,訪問(wèn)前需先將PSW2寄存器最高位置1                        
                        PWMCKS = 0x0f;                              // PWM時(shí)鐘為系統(tǒng)時(shí)鐘/16 ,以適應(yīng)不同PWM頻率。   
                        PWMCFG = 0x00;                                                                                          //PWM配置寄存器,PWM無(wú)中斷,PWM不與ADC關(guān)聯(lián)
                        if(pin==12) PWM2CR=0x08;
                        if(pin==22) PWM2CR=0x00;
                        if(pin==62) PWM2CR=0x10;
                        PWM2_T = Main_Fosc16/f;                   //計(jì)算PWM一個(gè)周期總脈沖數(shù)
                        PWMC = PWM2_T;                        //設(shè)置PWM周期時(shí)鐘數(shù)
                        PWM2T1= (long)pwm*PWM2_T/10000;              //PWM0在計(jì)數(shù)值為100H地方輸出低電平
                        PWM2T2= 0;                             //PWM0在計(jì)數(shù)值為700H地方輸出高電平                        
                        PWM2CR|=0x80;                          //使能PWM輸出
                        P_SW2  &= ~0x80;                       //PSW2寄存器最高位清0   
                        PWMCR  |= 0x80;   //使能PWM波形發(fā)生器,PWM計(jì)數(shù)器開(kāi)始工作
                        break;   //PWM0
                }
                case 3:
                {
                        //STORE=P_SW2;
                        P_SW2 |= 0x80; //以下寄存器為擴(kuò)展sfr,訪問(wèn)前需先將PSW2寄存器最高位置1                        
                        PWMCKS = 0x0f;                              // PWM時(shí)鐘為系統(tǒng)時(shí)鐘/16 ,以適應(yīng)不同PWM頻率。   
                        PWMCFG = 0x00;                                                                                          //PWM配置寄存器,PWM無(wú)中斷,PWM不與ADC關(guān)聯(lián)
                        if(pin==13) PWM3CR=0x08;
                        if(pin==23) PWM3CR=0x00;
                        if(pin==63) PWM3CR=0x10;
                        PWM3_T = Main_Fosc16/f;                   //計(jì)算PWM一個(gè)周期總脈沖數(shù)
                        PWMC = PWM3_T;                        //設(shè)置PWM周期時(shí)鐘數(shù)
                        PWM3T1= (long)pwm*PWM3_T/10000;              //PWM0在計(jì)數(shù)值為100H地方輸出低電平
                        PWM3T2= 0;                             //PWM0在計(jì)數(shù)值為700H地方輸出高電平                        
                        PWM3CR|=0x80;                          //使能PWM輸出
                        P_SW2  &= ~0x80;                       //PSW2寄存器最高位清0   
                        PWMCR  |= 0x80;   //使能PWM波形發(fā)生器,PWM計(jì)數(shù)器開(kāi)始工作
                        break;   //PWM0
                }
                case 4:
                {
                        //STORE=P_SW2;
                        P_SW2 |= 0x80; //以下寄存器為擴(kuò)展sfr,訪問(wèn)前需先將PSW2寄存器最高位置1                        
                        PWMCKS = 0x0f;                              // PWM時(shí)鐘為系統(tǒng)時(shí)鐘/16 ,以適應(yīng)不同PWM頻率。   
                        PWMCFG = 0x00;                                                                                          //PWM配置寄存器,PWM無(wú)中斷,PWM不與ADC關(guān)聯(lián)
                        if(pin==14) PWM4CR=0x08;
                        if(pin==24) PWM4CR=0x00;
                        if(pin==64) PWM4CR=0x10;
                        PWM4_T = Main_Fosc16/f;                   //計(jì)算PWM一個(gè)周期總脈沖數(shù)
                        PWMC = PWM4_T;                        //設(shè)置PWM周期時(shí)鐘數(shù)
                        PWM4T1= (long)pwm*PWM4_T/10000;              //PWM0在計(jì)數(shù)值為100H地方輸出低電平
                        PWM4T2= 0;                             //PWM0在計(jì)數(shù)值為700H地方輸出高電平                        
                        PWM4CR|=0x80;                          //使能PWM輸出
                        P_SW2  &= ~0x80;                       //PSW2寄存器最高位清0   
                        PWMCR  |= 0x80;   //使能PWM波形發(fā)生器,PWM計(jì)數(shù)器開(kāi)始工作
                        break;   //PWM0
                }
                case 5:
                {
                        //STORE=P_SW2;
                        P_SW2 |= 0x80; //以下寄存器為擴(kuò)展sfr,訪問(wèn)前需先將PSW2寄存器最高位置1                        
                        PWMCKS = 0x0f;                              // PWM時(shí)鐘為系統(tǒng)時(shí)鐘/16 ,以適應(yīng)不同PWM頻率。   
                        PWMCFG = 0x00;                                                                                          //PWM配置寄存器,PWM無(wú)中斷,PWM不與ADC關(guān)聯(lián)
                        if(pin==15) PWM5CR=0x08;
                        if(pin==25) PWM5CR=0x00;
                        if(pin==65) PWM5CR=0x10;
                        PWM5_T = Main_Fosc16/f;                   //計(jì)算PWM一個(gè)周期總脈沖數(shù)
                        PWMC = PWM0_T;                        //設(shè)置PWM周期時(shí)鐘數(shù)
                        PWM5T1= (long)pwm*PWM5_T/10000;              //PWM0在計(jì)數(shù)值為100H地方輸出低電平
                        PWM5T2= 0;                             //PWM0在計(jì)數(shù)值為700H地方輸出高電平                        
                        PWM5CR|=0x80;                          //使能PWM輸出
                        P_SW2  &= ~0x80;                       //PSW2寄存器最高位清0   
                        PWMCR  |= 0x80;   //使能PWM波形發(fā)生器,PWM計(jì)數(shù)器開(kāi)始工作
                        break;   //PWM0
                }
                case 6:
                {
                        //STORE=P_SW2;
                        P_SW2 |= 0x80; //以下寄存器為擴(kuò)展sfr,訪問(wèn)前需先將PSW2寄存器最高位置1                        
                        PWMCKS = 0x0f;                              // PWM時(shí)鐘為系統(tǒng)時(shí)鐘/16 ,以適應(yīng)不同PWM頻率。   
                        PWMCFG = 0x00;                                                                                          //PWM配置寄存器,PWM無(wú)中斷,PWM不與ADC關(guān)聯(lián)
                        if(pin==16) PWM6CR=0x08;
                        if(pin==26) PWM6CR=0x00;
                        if(pin==66) PWM6CR=0x10;
                        PWM6_T = Main_Fosc16/f;                   //計(jì)算PWM一個(gè)周期總脈沖數(shù)
                        PWMC = PWM6_T;                        //設(shè)置PWM周期時(shí)鐘數(shù)
                        PWM6T1= (long)pwm*PWM6_T/10000;              //PWM0在計(jì)數(shù)值為100H地方輸出低電平
                        PWM6T2= 0;                             //PWM0在計(jì)數(shù)值為700H地方輸出高電平                        
                        PWM6CR|=0x80;                          //使能PWM輸出
                        P_SW2  &= ~0x80;                       //PSW2寄存器最高位清0   
                        PWMCR  |= 0x80;   //使能PWM波形發(fā)生器,PWM計(jì)數(shù)器開(kāi)始工作
                        break;   //PWM0
                }
                case 7:
                {
                        //STORE=P_SW2;
                        P_SW2 |= 0x80; //以下寄存器為擴(kuò)展sfr,訪問(wèn)前需先將PSW2寄存器最高位置1                        
                        PWMCKS = 0x0f;                              // PWM時(shí)鐘為系統(tǒng)時(shí)鐘/16 ,以適應(yīng)不同PWM頻率。   
                        PWMCFG = 0x00;                                                                                          //PWM配置寄存器,PWM無(wú)中斷,PWM不與ADC關(guān)聯(lián)
                        if(pin==17) PWM7CR=0x08;
                        if(pin==27) PWM7CR=0x00;
                        if(pin==67) PWM7CR=0x10;
                        PWM7_T = Main_Fosc16/f;                   //計(jì)算PWM一個(gè)周期總脈沖數(shù)
                        PWMC = PWM7_T;                        //設(shè)置PWM周期時(shí)鐘數(shù)
                        PWM7T1= (long)pwm*PWM7_T/10000;              //PWM0在計(jì)數(shù)值為100H地方輸出低電平
                        PWM7T2= 0;                             //PWM0在計(jì)數(shù)值為700H地方輸出高電平                        
                        PWM7CR|=0x80;                          //使能PWM輸出
                        P_SW2  &= ~0x80;                       //PSW2寄存器最高位清0   
                        PWMCR  |= 0x80;   //使能PWM波形發(fā)生器,PWM計(jì)數(shù)器開(kāi)始工作
                        break;   //PWM0
                }
        }        
}void PWM_change(int pin,int pwm)    //改變PWM模塊占空比
{
        //STORE=P_SW2;
        P_SW2 |= 0x80;  //以下寄存器為擴(kuò)展sfr,訪問(wèn)前需先將PSW2寄存器最高位置1        
        switch(pin%10)
        {
                case 0:        PWM0T1= (long)pwm*PWM0_T/10000;        //PWM0在計(jì)數(shù)值為100H地方輸出低電平
                                                break;
                case 1:        PWM1T1= (long)pwm*PWM1_T/10000;        //PWM1在計(jì)數(shù)值為100H地方輸出低電平                                       
                                                break;
                case 2:        PWM2T1= (long)pwm*PWM2_T/10000;        //PWM2在計(jì)數(shù)值為100H地方輸出低電平                                       
                                                break;
                case 3:        PWM3T1= (long)pwm*PWM3_T/10000;        //PWM3在計(jì)數(shù)值為100H地方輸出低電平                                       
                                                break;
                case 4:        PWM4T1= (long)pwm*PWM4_T/10000;        //PWM4在計(jì)數(shù)值為100H地方輸出低電平
                                                break;
                case 5:        PWM5T1= (long)pwm*PWM5_T/10000;        //PWM5在計(jì)數(shù)值為100H地方輸出低電平
                                                break;
                case 6:        PWM6T1= (long)pwm*PWM6_T/10000;        //PWM6在計(jì)數(shù)值為100H地方輸出低電平
                                                break;
                case 7:        PWM7T1= (long)pwm*PWM7_T/10000;        //PWM7在計(jì)數(shù)值為100H地方輸出低電平
                                                break;
        }
        P_SW2  &= ~0x80;  //以上寄存器為擴(kuò)展sfr,訪問(wèn)后需將PSW2寄存器最高位置0
}
作者: yzwzfyz    時(shí)間: 2022-10-27 08:44
同頻就更好處理了:
設(shè)計(jì)有N個(gè)通道要做PWM,用變量TB計(jì)時(shí)PWM的周期,各通道再用變量TB1,TB2......,TBN計(jì)時(shí)負(fù)脈沖的時(shí)間。
用定時(shí)器定個(gè)基本時(shí)鐘,中斷服務(wù)程序做下列兩個(gè)動(dòng)作:
1、對(duì)周期計(jì)時(shí):TB-1。
PWM計(jì)滿時(shí)各通道清0,TB重置,TB1,TB2......,TBN復(fù)位置數(shù)成各自的負(fù)脈沖的時(shí)間。
2、如果TBx<>0,就 -1,當(dāng)TBx計(jì)滿時(shí)(TBx=0時(shí)),x通道就置1,TBx不重置保持0。
如果TBx=0,就不處理了。
這樣就成了。程序很簡(jiǎn)單。
作者: npn    時(shí)間: 2022-10-27 09:35
具體要看PWM控制什么,用邏輯分析儀捕捉。
作者: yjx156    時(shí)間: 2022-10-27 09:50
npn 發(fā)表于 2022-10-27 09:35
具體要看PWM控制什么,用邏輯分析儀捕捉。

作業(yè) 并沒(méi)有要求要控制什么,就是輸出一個(gè)相位差是周期時(shí)間/pwm路數(shù)的這么幾路pwm矩形波
作者: hhh402    時(shí)間: 2022-10-27 10:30
你認(rèn)真計(jì)算了嗎,你設(shè)置的PWM0-7全部都是一樣的。你連自己的算法都搞不清楚
作者: coody_sz    時(shí)間: 2022-10-27 10:34
STC8A8K64S4A12 或 STC8A8K64D4做樓主要求的PWM太方便了。
8路增強(qiáng)型PWM都是15位長(zhǎng)度,同頻率,每路PWM都可以獨(dú)立的設(shè)置輸出高電平和低電平的時(shí)刻,所以可以設(shè)置任意相位。
作者: wulin    時(shí)間: 2022-10-27 21:03
yjx156 發(fā)表于 2022-10-27 09:50
emmm課程作業(yè) 并沒(méi)有要求要控制什么,就是輸出一個(gè)相位差是周期時(shí)間/pwm路數(shù)的這么幾路pwm矩形波


就按這個(gè)套路可以增加N路同頻不同相PWM。
  1. #include<reg51.h>

  2. typedef unsigned int u16;
  3. typedef unsigned char u8;

  4. u8 i;

  5. sbit out1=P2^0;
  6. sbit out2=P2^1;
  7. sbit out3=P2^2;
  8. sbit out4=P2^3;


  9. void main()
  10. {   
  11.         TMOD= 0x01;                //設(shè)置定時(shí)器模式
  12.         TL0 = 0x18;                //設(shè)置定時(shí)初始值
  13.         TH0 = 0xFC;                //設(shè)置定時(shí)初始值
  14.         TF0 = 0;                //清除TF0標(biāo)志
  15.         TR0 = 1;                //定時(shí)器0開(kāi)始計(jì)時(shí)
  16.         ET0=1;        //開(kāi)T0中斷
  17.         EA=1;        //開(kāi)總中斷
  18.         while(1);
  19. }

  20. //定時(shí)器T1的中斷服務(wù)函數(shù)
  21. void T0_time()  interrupt 1
  22. {   
  23.         TL0 = 0x18;                //設(shè)置定時(shí)初始值
  24.         TH0 = 0xFC;                //設(shè)置定時(shí)初始值
  25.         switch(i)
  26.         {
  27.                 case 0: out1=~out1; break;
  28.                 case 1: out2=~out2; break;
  29.                 case 2: out3=~out3; break;
  30.                 case 3: out4=~out4; break;
  31.         }
  32.         i=++i%4;
  33. }
復(fù)制代碼








歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 成人在线黄色 | 色姑娘av | 91高清在线观看 | 国产免费视频 | 欧美激情久久久 | 久久影院一区 | 欧美一级免费 | 色婷婷综合久久久中文字幕 | av影音资源 | 你懂的免费在线 | 亚洲精品成人 | 91免费在线视频 | 久久久www成人免费精品 | 天天人人精品 | 日韩一区二区三区在线视频 | 成人国产精品免费观看视频 | 欧美一级黑人aaaaaaa做受 | 日本激情视频网 | 国产精品久久久乱弄 | 午夜精品久久久久久不卡欧美一级 | 久久久久综合 | 成人免费日韩 | 久草精品视频 | 久久精品一级 | 欧美一级二级三级视频 | 精品国产不卡一区二区三区 | 国产一区二区三区网站 | 亚洲精选久久 | 免费成人高清在线视频 | 国产激情综合五月久久 | 在线成人一区 | 亚洲精品中文字幕在线 | 亚洲天堂一区二区 | 热99| 欧美精品福利视频 | 亚洲久视频 | 91精品国模一区二区三区 | 国产精品色 | 欧美一级视频免费看 | 看黄在线 | 欧美日本在线 |