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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 1964|回復(fù): 6
收起左側(cè)

STC8A單片機(jī)輸出任意路(8路以內(nèi))同頻率同占空比不同相位的pwm波怎么實(shí)現(xiàn)啊?求指點(diǎn)

[復(fù)制鏈接]
回帖獎(jiǎng)勵(lì) 5 黑幣 回復(fù)本帖可獲得 5 黑幣獎(jiǎng)勵(lì)! 每人限 1 次
ID:1005634 發(fā)表于 2022-10-26 22:17 | 顯示全部樓層 |閱讀模式
用定時(shí)器1查詢延時(shí)和中斷延時(shí)都試過了,示波器上顯示的都是相位一樣的PWM波。求大神指點(diǎn)。每路的相位差值是打算弄成(一個(gè)周期的時(shí)間/pwm路數(shù))。
PWM波是直接用STC8A上pwm寄存器生成的代碼如下(這個(gè)生成pwm波應(yīng)該沒有問題示波器上顯示是正確的):
void PWM_init(int pin,long f,int pwm)  //PWM初始化函數(shù)
{
        switch(pin%10)
        {
                case 0:
                {
                        //STORE=P_SW2;
                        P_SW2 |= 0x80; //以下寄存器為擴(kuò)展sfr,訪問前需先將PSW2寄存器最高位置1                        
                        PWMCKS = 0x0f;                              // PWM時(shí)鐘為系統(tǒng)時(shí)鐘/16 ,以適應(yīng)不同PWM頻率。   
                        PWMCFG = 0x00;                                                                                          //PWM配置寄存器,PWM無中斷,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ù)器開始工作
                        break;   //PWM0
                }
                case 1:
                {
                        //STORE=P_SW2;
                        P_SW2 |= 0x80; //以下寄存器為擴(kuò)展sfr,訪問前需先將PSW2寄存器最高位置1                        
                        PWMCKS = 0x0f;                              // PWM時(shí)鐘為系統(tǒng)時(shí)鐘/16 ,以適應(yīng)不同PWM頻率。   
                        PWMCFG = 0x00;                                                                                          //PWM配置寄存器,PWM無中斷,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ù)器開始工作
                        break;   //PWM1
                }
                case 2:
                {
                        //STORE=P_SW2;
                        P_SW2 |= 0x80; //以下寄存器為擴(kuò)展sfr,訪問前需先將PSW2寄存器最高位置1                        
                        PWMCKS = 0x0f;                              // PWM時(shí)鐘為系統(tǒng)時(shí)鐘/16 ,以適應(yīng)不同PWM頻率。   
                        PWMCFG = 0x00;                                                                                          //PWM配置寄存器,PWM無中斷,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ù)器開始工作
                        break;   //PWM0
                }
                case 3:
                {
                        //STORE=P_SW2;
                        P_SW2 |= 0x80; //以下寄存器為擴(kuò)展sfr,訪問前需先將PSW2寄存器最高位置1                        
                        PWMCKS = 0x0f;                              // PWM時(shí)鐘為系統(tǒng)時(shí)鐘/16 ,以適應(yīng)不同PWM頻率。   
                        PWMCFG = 0x00;                                                                                          //PWM配置寄存器,PWM無中斷,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ù)器開始工作
                        break;   //PWM0
                }
                case 4:
                {
                        //STORE=P_SW2;
                        P_SW2 |= 0x80; //以下寄存器為擴(kuò)展sfr,訪問前需先將PSW2寄存器最高位置1                        
                        PWMCKS = 0x0f;                              // PWM時(shí)鐘為系統(tǒng)時(shí)鐘/16 ,以適應(yīng)不同PWM頻率。   
                        PWMCFG = 0x00;                                                                                          //PWM配置寄存器,PWM無中斷,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ù)器開始工作
                        break;   //PWM0
                }
                case 5:
                {
                        //STORE=P_SW2;
                        P_SW2 |= 0x80; //以下寄存器為擴(kuò)展sfr,訪問前需先將PSW2寄存器最高位置1                        
                        PWMCKS = 0x0f;                              // PWM時(shí)鐘為系統(tǒng)時(shí)鐘/16 ,以適應(yīng)不同PWM頻率。   
                        PWMCFG = 0x00;                                                                                          //PWM配置寄存器,PWM無中斷,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ù)器開始工作
                        break;   //PWM0
                }
                case 6:
                {
                        //STORE=P_SW2;
                        P_SW2 |= 0x80; //以下寄存器為擴(kuò)展sfr,訪問前需先將PSW2寄存器最高位置1                        
                        PWMCKS = 0x0f;                              // PWM時(shí)鐘為系統(tǒng)時(shí)鐘/16 ,以適應(yīng)不同PWM頻率。   
                        PWMCFG = 0x00;                                                                                          //PWM配置寄存器,PWM無中斷,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ù)器開始工作
                        break;   //PWM0
                }
                case 7:
                {
                        //STORE=P_SW2;
                        P_SW2 |= 0x80; //以下寄存器為擴(kuò)展sfr,訪問前需先將PSW2寄存器最高位置1                        
                        PWMCKS = 0x0f;                              // PWM時(shí)鐘為系統(tǒng)時(shí)鐘/16 ,以適應(yīng)不同PWM頻率。   
                        PWMCFG = 0x00;                                                                                          //PWM配置寄存器,PWM無中斷,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ù)器開始工作
                        break;   //PWM0
                }
        }        
}void PWM_change(int pin,int pwm)    //改變PWM模塊占空比
{
        //STORE=P_SW2;
        P_SW2 |= 0x80;  //以下寄存器為擴(kuò)展sfr,訪問前需先將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,訪問后需將PSW2寄存器最高位置0
}
回復(fù)

使用道具 舉報(bào)

ID:123289 發(fā)表于 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)單。
回復(fù)

使用道具 舉報(bào)

ID:57657 發(fā)表于 2022-10-27 09:35 | 顯示全部樓層
具體要看PWM控制什么,用邏輯分析儀捕捉。
回復(fù)

使用道具 舉報(bào)

ID:1005634 發(fā)表于 2022-10-27 09:50 | 顯示全部樓層
npn 發(fā)表于 2022-10-27 09:35
具體要看PWM控制什么,用邏輯分析儀捕捉。

作業(yè) 并沒有要求要控制什么,就是輸出一個(gè)相位差是周期時(shí)間/pwm路數(shù)的這么幾路pwm矩形波
回復(fù)

使用道具 舉報(bào)

ID:491577 發(fā)表于 2022-10-27 10:30 | 顯示全部樓層
你認(rèn)真計(jì)算了嗎,你設(shè)置的PWM0-7全部都是一樣的。你連自己的算法都搞不清楚
回復(fù)

使用道具 舉報(bào)

ID:1034262 發(fā)表于 2022-10-27 10:34 | 顯示全部樓層
STC8A8K64S4A12 或 STC8A8K64D4做樓主要求的PWM太方便了。
8路增強(qiáng)型PWM都是15位長(zhǎng)度,同頻率,每路PWM都可以獨(dú)立的設(shè)置輸出高電平和低電平的時(shí)刻,所以可以設(shè)置任意相位。
回復(fù)

使用道具 舉報(bào)

ID:213173 發(fā)表于 2022-10-27 21:03 | 顯示全部樓層
yjx156 發(fā)表于 2022-10-27 09:50
emmm課程作業(yè) 并沒有要求要控制什么,就是輸出一個(gè)相位差是周期時(shí)間/pwm路數(shù)的這么幾路pwm矩形波

無標(biāo)題.jpg
就按這個(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開始計(jì)時(shí)
  16.         ET0=1;        //開T0中斷
  17.         EA=1;        //開總中斷
  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ù)制代碼



回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 免费一区| 欧美在线资源 | 精品久久影院 | 亚洲激情在线观看 | 日韩av一区二区在线观看 | 欧美综合国产精品久久丁香 | 欧美国产日韩在线观看 | 91啪亚洲精品| 国产丝袜一区二区三区免费视频 | 亚洲一区国产精品 | 黄色在线播放视频 | 狠狠色狠狠色综合日日92 | 成年女人免费v片 | 欧美日韩综合视频 | 日日综合 | 国产精品1区 | av免费在线观看网站 | 国产精品日韩在线观看一区二区 | 成人毛片视频免费 | 91精品一区二区三区久久久久 | 久久成人免费观看 | 欧美日韩一区在线 | 欧美日韩国产欧美 | 在线观看中文字幕 | 午夜专区 | 视频一区在线播放 | 一本色道精品久久一区二区三区 | 欧美午夜精品 | 国产成人小视频 | 91五月天 | 欧美一区在线看 | 精品国产乱码久久久久久中文 | 色婷婷国产精品综合在线观看 | 欧美一级二级三级视频 | 华人黄网站大全 | 国产精品国产精品国产专区不卡 | 国产亚洲一区二区精品 | 欧美日韩在线综合 | 国产精品福利在线观看 | 亚洲一区精品在线 | 欧美性大战久久久久久久蜜臀 |