找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2473|回復(fù): 9
打印 上一主題 下一主題
收起左側(cè)

請教用大循環(huán)發(fā)送PWM,慢一點原因

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:734017 發(fā)表于 2022-2-28 10:11 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
本帖最后由 happy2058 于 2022-2-28 10:16 編輯

請教一下,下面寫法,大循環(huán)跑不動原因    用定時器反轉(zhuǎn)一個標(biāo)志位,大循環(huán)判斷發(fā)送。8H1K08   24M     開了串口1串口2 不在中斷狀態(tài)      
我想定時器多用的情況下,反轉(zhuǎn)不同的標(biāo)志位讓大循環(huán)判斷輸出
void main()
{                        
                        P_SW2 |= 0x80;                        //擴(kuò)展 RAM 區(qū)特殊功能寄存器(XFR)訪問控制寄存器
                        CKSEL = 0x00;         //8H默認(rèn)內(nèi)部IRC
                        CLKDIV =0x00;           //不分頻SYSCLK時鐘
                        IOsatar();                                //IO口模式
                        Timer0();                                 //定時器0 100uS
                        Uart_Init();                          //串口中斷
                        EA=1;
                        //WDT_CONTR = 0x24; //?????,?????? 1s
                        
                                
while(1)
        {
                key_service2();                      //串口接收判斷,空閑
                Circular_transmission();           //串口隊列發(fā)送,空閑
                TXD_Send_out_uart2();          //直接發(fā)送,空閑
                Set_time();                          //時間隊列發(fā)送,空閑  
                facecare_start()        ;                 //時間隊列發(fā)送,空閑  
                Microneedle_forward_PWM_out ();                       //PWM  輸出
        }
        
}



ode unsigned char Microneedle_speed_intensity[11]={0,1,2,3,4,5,6,7,8,9,10};
unsigned char Microneedle_speed_counters_time=0;
unsigned char Microneedle_speed=0;
bit Open_speed_dose_key=0;
//=====================================================================
void Microneedle_forward_PWM_out ()
{
        if(Microneedle_speed_counters)
        {
                Microneedle_speed_counters=~Microneedle_speed_counters;
                Microneedle_speed_counters_time++;
                if(Microneedle_speed_counters_time<=Microneedle_speed_intensity[Microneedle_speed])
                {
                                        Microneedle_PWM_out=1;
                }
                        else         
                        {
                                Microneedle_PWM_out=0;
                                
                        }
                        if(Microneedle_speed_counters_time>=10)
                                        Microneedle_speed_counters_time=0;
                }        
}


void Timer0()      100US   
{        
        AUXR |= 0x80;                        //1T
        TMOD &= 0xF0;           //清零T0的控制位
        TL0 = 0xA0;                //設(shè)置定時初始值
        TH0 = 0xF6;                //設(shè)置定時初始值置定時初始值
        ET0 = 1;        //使能T0中斷
        TF0  = 0;                //清除TF0標(biāo)志
        TR0 = 1;        //啟動T0
}

//****************************************************************
void TM0_Isr() interrupt 1                                        //定時器0中斷
{               
        
        //if(UL_INO_CLOK_lock||MIC_lock||RSM_lock)                                                                                                                                         
        //        {
                        //facecare_Time_Counter=~facecare_Time_Counter;
        //        }
                        
                if(Open_speed_dose_key)
                                 {
                                                Microneedle_speed_counters=~Microneedle_speed_counters;
                                 }                                         
                                 
  }



占空比前后抖動,如果是寫在定時器里面是不會的
oid TM0_Isr() interrupt 1                                        //定時器0中斷
{               
      
        //if(UL_INO_CLOK_lock||MIC_lock||RSM_lock)                                                                                                                                       
        //        {
                        //facecare_Time_Counter=~facecare_Time_Counter;
        //        }
                       
               Microneedle_speed_counters_time++;
                if(Microneedle_speed_counters_time<=Microneedle_speed_intensity[Microneedle_speed])
                {
                                        Microneedle_PWM_out=1;
                }
                        else        
                        {
                                Microneedle_PWM_out=0;
                              
                        }
                        if(Microneedle_speed_counters_time>=10)
                                        Microneedle_speed_counters_time=0;
                                 
  }這個子是不會有問題


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:123289 發(fā)表于 2022-2-28 14:32 | 只看該作者
提示:
1、PWM的基礎(chǔ)時鐘取自何處?(假設(shè)來自于事件A。)
2、A事件在其它中斷發(fā)生時,會不會受到影響?(其它中斷更高級,會打斷A。
回復(fù)

使用道具 舉報

板凳
ID:734017 發(fā)表于 2022-2-28 16:26 | 只看該作者
yzwzfyz 發(fā)表于 2022-2-28 14:32
提示:
1、PWM的基礎(chǔ)時鐘取自何處?(假設(shè)來自于事件A。)
2、A事件在其它中斷發(fā)生時,會不會受到影響?( ...

是啊,我試了好久,發(fā)現(xiàn)不能這寫設(shè)到T0最高級  TO做100us標(biāo)志位反轉(zhuǎn),時間基準(zhǔn)
事件A 在while(1)判斷標(biāo)志位,自加,反轉(zhuǎn)輸出,反轉(zhuǎn)標(biāo)志位,為下一次TO中斷判斷。

輸出不一至的原因,可能是事件A 在while(1)順序,他不是中斷后馬上判斷,造成延遲了。
回復(fù)

使用道具 舉報

地板
ID:8222 發(fā)表于 2022-2-28 16:47 | 只看該作者
為什么不是發(fā)送控制參數(shù),讓從機(jī)按參數(shù)要求產(chǎn)生PWM?
回復(fù)

使用道具 舉報

5#
ID:401564 發(fā)表于 2022-2-28 19:09 | 只看該作者
1,你要設(shè)定要好各個中斷的優(yōu)先等級,100uS的定時器中斷時間是很短的,你要根據(jù)你自己的實際要求來設(shè)定好優(yōu)先等級,默認(rèn)的等級都是一樣的,但查詢是有先后順序的,當(dāng)定時器進(jìn)入中斷之后,串口中斷就被阻斷了
2,更改PWM占空比在主函數(shù)更改,定時器只作一個加載的,調(diào)節(jié)會慢一點,但不會有太大影響的,給個代碼參考一下

void timer1_pwm()interrupt 3                        //利用t1定時器產(chǎn)生PWM波形
{       
        TF1 = 0;                                                        //清除TF1標(biāo)志
                        if(HI)
                        {
                                TH1=pwm_l_H; //低電平時間
                                TL1=pwm_l_L; //
                                HI=0;
                                PWM=0;
                        }
                           else
                        {
                                TH1=pwm_h_H;                 //高電平時間
                                TL1=pwm_h_L;                 //
                                HI=1;
                                PWM=1;
                        }
        TR1 = 1;                        //定時器1開始計時                                                                
}
在主函數(shù)調(diào)節(jié)pwm_l_H和pwm_l_L這兩個全局變量就可以了
回復(fù)

使用道具 舉報

6#
ID:734017 發(fā)表于 2022-2-28 20:21 | 只看該作者
Y_G_G 發(fā)表于 2022-2-28 19:09
1,你要設(shè)定要好各個中斷的優(yōu)先等級,100uS的定時器中斷時間是很短的,你要根據(jù)你自己的實際要求來設(shè)定好優(yōu)先 ...

謝謝這位大哥,這個你之前已經(jīng)教過我了,再次感謝,F(xiàn)在是一個定時器處理多個任務(wù)。
回復(fù)

使用道具 舉報

7#
ID:401564 發(fā)表于 2022-2-28 20:43 | 只看該作者
happy2058 發(fā)表于 2022-2-28 20:21
謝謝這位大哥,這個你之前已經(jīng)教過我了,再次感謝,F(xiàn)在是一個定時器處理多個任務(wù)。

如果不是商業(yè)機(jī)密,就把完整的代碼上傳
如果是不方便,你至少是要說明,現(xiàn)在要做什么,一共要做幾個任務(wù),或者是要給個電路圖看一下是怎么一回事
不然的話,大多的網(wǎng)友其實是不知道你要做什么的
回復(fù)

使用道具 舉報

8#
ID:734017 發(fā)表于 2022-2-28 21:55 | 只看該作者
Y_G_G 發(fā)表于 2022-2-28 20:43
如果不是商業(yè)機(jī)密,就把完整的代碼上傳
如果是不方便,你至少是要說明,現(xiàn)在要做什么,一共要做幾個任務(wù),或 ...

這是A板串口2負(fù)責(zé)與屏幕發(fā)送接收通信,還有一個B板串口1負(fù)責(zé)發(fā)送,不接收,屏幕發(fā)送數(shù)據(jù)到A板,A板返回要顯示的內(nèi)容,執(zhí)行功能,如果是A板上功能就A板輸上。B板就再用串口2發(fā)送出去,F(xiàn)在A板是單功能的,三個IO口控制兩個電機(jī)。
現(xiàn)在我寫A板功能這部份,有的別的板有這個功能,所以我現(xiàn)在寫的時候不能把輸出寫在中斷里,功能多了,還要加功能在定時器里面,以后不方便移,。定時器1用來保留用0.5US可調(diào)占空比用的、
這是我寫的,A板通信,我寫了可以直接發(fā)送和大循環(huán)發(fā)送,大循環(huán)發(fā)送一次可以處理兩條指令,不占用大循環(huán)時間,A板功能在最下面一個,他被TO調(diào)用,MAIN調(diào)用,串口通信部分判斷,執(zhí)行A板通信部分,再執(zhí)行功能部分。

51hei截圖_20220228214909.png (27.02 KB, 下載次數(shù): 29)

51hei截圖_20220228214909.png
回復(fù)

使用道具 舉報

9#
ID:734017 發(fā)表于 2022-2-28 22:08 | 只看該作者
Y_G_G 發(fā)表于 2022-2-28 20:43
如果不是商業(yè)機(jī)密,就把完整的代碼上傳
如果是不方便,你至少是要說明,現(xiàn)在要做什么,一共要做幾個任務(wù),或 ...

A板就輸出兩路PWM 2K的 占空比10%可調(diào),用一個定時器,盡量不要過多的操作,后期方便移值,因為后期一個定時器要干幾個功能。
回復(fù)

使用道具 舉報

10#
ID:401564 發(fā)表于 2022-2-28 22:35 | 只看該作者
happy2058 發(fā)表于 2022-2-28 22:08
A板就輸出兩路PWM 2K的 占空比10%可調(diào),用一個定時器,盡量不要過多的操作,后期方便移值,因為后期一個 ...

2KHZ的%10就是50uS,那就是說最壞的情況就是兩次中斷的間隔是50uS,整體就是每500uS進(jìn)入定時器中斷兩次,如果定時器中斷做的事情太多了,主函數(shù)就會慢下來了
進(jìn)入定時器中斷盡可能的不要處理太多東西,但凡是能在主函數(shù)處理的,就不要在中斷中處理
定時器優(yōu)先等級設(shè)定為最高,這樣就保證PWM占空比的穩(wěn)定
串口的波特率要盡量的設(shè)定低一點,這樣就不會丟數(shù)據(jù)
個人感覺,如果量不大的話,就換成STC8G1K08的,這個有片上PWM,能省事很多,價格也就高了那么一兩毛的而已
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表