欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3189|回復: 16
打印 上一主題 下一主題
收起左側

求解,STC8F2K16S2單片機最快定時

[復制鏈接]
跳轉到指定樓層
樓主
ID:734017 發表于 2021-10-19 01:16 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
先上圖
這是別人工程師用8F2K16S寫的,內部高精度24M,1T  匯編

這個是IO口P1.1輸出PWM可調占空比
占空比增加0.5 %  時間加0.4us,這里可能有中斷延時。也可能用計數模式。時間不是很準。按0.4US計數,分辨率有200檔
其它還有P1.0    周期20MS  50K  可調
P5.5 20MS 50K 可調
P2.3   P2.4 P2.5 P2.6   這4個IO輸出在60K 左右,可調 占空比
串口1   115200  只接收
加上其它IO 取反控制。以上功能全用,不沖突
重點是P1.1這路PWM
我用C語言做不了這么快,用定時器只輸出一路P1.1PWM,只能用1US中斷 再快就會出錯。如果串口優先最高。對其他定時器影響如何計算。

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

使用道具 舉報

沙發
ID:429003 發表于 2021-10-19 09:12 | 只看該作者
對這款單片機不熟悉,但是精度能控制到0.4us并且是穩定的,肯定不是靠中斷控制IO實現的,應該是硬件定時器自動完成的!
串口接收可用DMA或中斷加定時器實現,幾乎不占CPU時間。
回復

使用道具 舉報

板凳
ID:277550 發表于 2021-10-19 09:26 | 只看該作者
僅做單一功能,會穩定一些
回復

使用道具 舉報

地板
ID:276663 發表于 2021-10-19 10:35 | 只看該作者
不會選帶PWM輸出的IC嗎?非要用這一款?
既然別人用匯編,你要知道匯編的效率,執行中斷的速度快。
回復

使用道具 舉報

5#
ID:734017 發表于 2021-10-19 11:03 | 只看該作者
IdeaMing 發表于 2021-10-19 10:35
不會選帶PWM輸出的IC嗎?非要用這一款?
既然別人用匯編,你要知道匯編的效率,執行中斷的速度快。

產品已成形了。其中有很多苦處。不好說。
其它都好搞,就是這個太快了
回復

使用道具 舉報

6#
ID:734017 發表于 2021-10-19 11:03 | 只看該作者
xstong 發表于 2021-10-19 09:12
對這款單片機不熟悉,但是精度能控制到0.4us并且是穩定的,肯定不是靠中斷控制IO實現的,應該是硬件定時器 ...

請指導一下
回復

使用道具 舉報

7#
ID:734017 發表于 2021-10-19 11:04 | 只看該作者
devcang 發表于 2021-10-19 09:26
僅做單一功能,會穩定一些

拿別人的,不良率5/1000
回復

使用道具 舉報

8#
ID:401564 發表于 2021-10-19 11:21 | 只看該作者
0.4uS已經是到一個時鐘的長度
可能是用的是自動重載功能,這樣,進入中斷就不用對計數器進行操作了
PWM也可以是達到1個時鐘的精度,也不用進入中斷操作的,調節占空比的時候可能要慢一點
回復

使用道具 舉報

9#
ID:734017 發表于 2021-10-19 13:59 | 只看該作者
Y_G_G 發表于 2021-10-19 11:21
0.4uS已經是到一個時鐘的長度
可能是用的是自動重載功能,這樣,進入中斷就不用對計數器進行操作了
PWM也可 ...

C163557_7FC7AC4F38C1270EEB607D94DD1F8DD7.pdf (7.59 MB, 下載次數: 13)

沒有計數,改變初值,占空比不好改。大哥幫我看看,手冊上最后一個功能:增強型雙數據指針,是否可以用這個功能實現。這個芯片沒有PWM寄存器
回復

使用道具 舉報

10#
ID:213173 發表于 2021-10-19 13:59 | 只看該作者
樓主計算的時間與示波器顯示不符
回復

使用道具 舉報

11#
ID:734017 發表于 2021-10-19 14:11 | 只看該作者
wulin 發表于 2021-10-19 13:59
樓主計算的時間與示波器顯示不符

我換一個看看
回復

使用道具 舉報

12#
ID:401564 發表于 2021-10-19 16:30 | 只看該作者
happy2058 發表于 2021-10-19 13:59
沒有計數,改變初值,占空比不好改。大哥幫我看看,手冊上最后一個功能:增強型雙數據指針,是否可以 ...

那就用16位定時器來輸出PWM
在定時器中斷中實現PWM占空比,調節在主程序調節
在定時器中斷中加載TH0,TL0
在主程序調節TH0,TL0
匯編是效率高,不是速度快,C在99%的情況下都可以達到匯編的速度的,你的不快,只是方法不對而已
把你的代碼上傳,看一下你是怎么調節PWM的,不要截圖
手頭上沒有示波器,不好搞
我以前就是用匯編的,除了占用空間小點,暫時沒有體驗到匯編的其它優點
回復

使用道具 舉報

13#
ID:734017 發表于 2021-10-19 22:01 | 只看該作者
Y_G_G 發表于 2021-10-19 16:30
那就用16位定時器來輸出PWM
在定時器中斷中實現PWM占空比,調節在主程序調節
在定時器中斷中加載TH0,TL0 ...

一般都這樣寫,這是兩組20MS 50K的  要求不高,就這樣寫了。上圖那個0.4US的是另一組功能。我用0.5US試過,直接卡死
void key_service()                大循環掃描串口緩存                                                
{
        key_service_lock=0;                串口標志位
switch(buf[1])                                                                
                        {
                        case 0X79:


if(        buf[3]==0x09)                                                               
                                {                       
                                        memset(buf, 0, 16); //清串口緩存
                                        if(clok<20)
                                        {
                                        clok++;
                                        Energy_TXD(clok,         0x03 ,Energy_current_X[1],Energy_current_X2[1]); //發送屏幕顯示
                                        }
                                }
                                if(        buf[3]==0x10)                                                               
                                {                       
                                        memset(buf, 0, 16);
                                        if(clok>=1)
                                        {
                                        clok--;
                                                                               
                                        Energy_TXD(clok,         0x03 ,Energy_current_X[1],Energy_current_X2[1]);
                                        }
if(        buf[3]==0x12)                                                               
                                {       
                                        memset(buf, 0, 16);
                                        if(RF>=1)
                                        {
                                        RF--;
                                        Energy_TXD(RF, 0x03,Energy_current_X[2],Energy_current_X2[2]);       
                                        }
                                }
                                if(        buf[3]==0x13)                                                               
                                {                       
                                        memset(buf, 0, 16);
                                        if(ul<20)
                                        {
                                        ul++;
                                        Energy_TXD(ul,         0x03,Energy_current_X[3],Energy_current_X2[3]);       
                                        }
break;       
case 0X78:
break; default:break;
**********************
**********************



code unsigned char ul_PWMCounterSATAT[52]={0,1,2,3,4,******************,0};            
code unsigned char clok_PWMCounterSATAT[52]={0,1,2,3,4,******************,0};
void InterruptTimer0() interrupt 1                //400US一次        20MS 50K  16位自動重裝       
{       
                  if (ul_satar|clok_satar)             大循環標志位,兩個功能 P2.0  P2.1   
         {
                          PWMCounter++;                                       
                           if(ul_satar)                             //P2.0  
                           {  
                                if(PWMCounter<=ul_PWMCounterSATAT[ul])
                                        PWM=1;
                                else PWM=0;
                           }
                        if (clok_satar)           //  P2.1
                        {               
                                if(PWMCounter<=clok_PWMCounterSATAT[clok])
                                        clok_PWM=0;
                                else clok_PWM=1;
                        }
                        if(PWMCounter>=50)
                                PWMCounter=0;
        }
                else
        {
                        PWMCounter=0;
        }
}


***********************************************************用0.5US做PWM 程序不動,卡死。
void TM1_Isr() interrupt 3         0.5US                               
{
       
       
                                RF_PWMCounter++;                                       
                          
                                if(RF_PWMCounter<=40)
                                        P1_1=1;
                                else P1_1=0;
                         
                                if(RF_PWMCounter>=200)
                                        RF_PWMCounter=0;
       
                       
}




回復

使用道具 舉報

14#
ID:401564 發表于 2021-10-20 10:47 | 只看該作者
盡量不要在定時器中斷中進行任何運算,所有的處理都在主程序中處理,可能處理速度會慢一點,因為會被定時器打斷以下是我學習板上寫的,手頭上沒有STC8H單片機,用8A的試了一下,你自己用示波器看一下
#include "Stc8a.h"
bit PWM_H;                        //標志PWM的高電平
unsigned int Duty;                        //高電平時間
unsigned char PWM_TIME_H_L;//PWM高電平時間的低位
unsigned char PWM_TIME_H_H;//PWM高電平時間的高位
unsigned char PWM_TIME_L_L;//PWM低電平時間的低位
unsigned char PWM_TIME_L_H;//PWM高電平時間的高位
sbit OUT=P0^0;
void main()
{
    P0M0=0XFF;
        P0=0X00;
        PWM_H=0;                        //PWM默認低電平時間
        Duty=10;                         //占空比設定
        AUXR |= 0x80;                //定時器時鐘1T模式
        TMOD = 0x01;                //設置定時器模式:不自動重載
        TL0 = (65535-Duty)%256;                //設置定時初始值
        TH0 = (65535-Duty)/256;                //設置定時初始值
        TF0 = 0;                //清除TF0標志
        TR0 = 1;                //定時器0開始計時
        ET0=1;
    EA = 1;
    while (1)
        {
                PWM_TIME_H_L=(65535-Duty)%256;
                PWM_TIME_H_H=(65535-Duty)/256;
                PWM_TIME_L_L=(65535-50000+Duty)%256;        //設置定時初始值,50000為PWM整個周期的時間
                PWM_TIME_L_H=(65535-50000+Duty)/256;
        }

}
//===========================================================
void TM0_Isr() interrupt 1                                      
{                                                     
     if(PWM_H)
                 {
                         PWM_H=0;
                        OUT=1;       
                        TL0 = PWM_TIME_H_L;                //設置定時初始值
                        TH0 = PWM_TIME_H_H;                //設置定時初始值
                 }
        else
                 {
                         PWM_H=1;
                        OUT=0;       
                        TL0 =PWM_TIME_L_L;                //設置定時初始值
                        TH0 =PWM_TIME_L_H;                //設置定時初始值
                 }                
        TR0 = 1;                                 
}


回復

使用道具 舉報

15#
ID:624769 發表于 2021-10-20 13:21 來自觸屏版 | 只看該作者
24m的晶振,1us就是24個時鐘,0.5us就是12個時鐘,去掉進入中斷3個時鐘,退出中斷reti又3個時鐘,那么如果你中斷里面的程序達到6個時鐘,那么你的程序就待在中斷里不用出來了,而粗看你的代碼,就算全是一個時鐘,也遠超6個時鐘了,所以,只要你的中斷策略不變,你這程序就沒法正常跑起來。
回復

使用道具 舉報

16#
ID:734017 發表于 2021-10-20 23:37 | 只看該作者
188610329 發表于 2021-10-20 13:21
24m的晶振,1us就是24個時鐘,0.5us就是12個時鐘,去掉進入中斷3個時鐘,退出中斷reti又3個時鐘,那么如果 ...

感謝,現在對時鐘上的認識還不夠,謝謝指導
回復

使用道具 舉報

17#
ID:734017 發表于 2021-10-20 23:40 | 只看該作者
Y_G_G 發表于 2021-10-20 10:47
盡量不要在定時器中斷中進行任何運算,所有的處理都在主程序中處理,可能處理速度會慢一點,因為會被定時器打 ...

感謝大哥,這幾天比較忙,回家都半晚了,抽時間弄弄,這個寫法好,在不進入中斷時候,不響影其它操作,留給其它指令時間就多了。謝謝你
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表