使用cnnt 對脈沖計數,TMR1對上升沿計時,TMR2對下降沿計時,TMR1設定為100MS的定時器,TMR2 設定為40MS的定時器。
脈沖周期 為50HZ到300HZ的變化,脈沖寬度為2MS到20MS的變化,檢測脈沖的個數以及寬度。
按下RA0(UP)電機正轉,開始對RA2外部脈沖計數判斷寬度。cnnt=380時。停止電機轉動
按下RA5(DN)電機反轉,開始對RA2外部脈沖計數判斷寬度。cnnt==0時。 停止電機轉動
程序里邊用了RA1對是否進入中斷進行判斷。目前程序檢測不到RA1的變化。是否我的設計架構方案不對。
#include
__CONFIG(0x3004);//(0X30C4);
#define T0_40MS 100 // 定義 TMR0 延時10MS 的時間常數
#define T1_100MS 40536
#define DN RA5 //Motor rise 2 DN
#define UP RA0 //Motor decline 13 UP
#define MOTA RC5 //Motor Forward 5
#define MOTB RC4 //Motor Reversal 6
bit rise; //正反轉標志位
bit tmrl; //正反轉標志位
bit tmrh; //正反轉標志位
unsigned int num; //脈沖總個數
unsigned int cnnt; //脈沖計數
unsigned int timerl; //TMR1脈沖上升沿時間
unsigned int timerh; //TMR1脈沖下降沿時間
unsigned int cnnt_timer;//TMR1脈沖總時間
unsigned int cnnt_tmr2; //TMR2脈沖總時間
unsigned int signal_key();
unsigned int getkey() ;
void Delay_MS(unsigned int t);
void initial()
{
TRISA=0x3D;//3D;RA2=1,
TRISC=0X0E;
OPTION=0x87;//RA2內部中斷時源
INTCON=0xF0;//外圍中斷允許
CMCON0 = 0X07;
ANSEL = 0;
// TMR0=T0_40MS;//啟動TMR0自帶振蕩器,分頻比為1:256
T1CON=0X22;//2啟動TMR1自帶振蕩器,分頻比為1:4關閉TRM1ON=0;
TMR1H=T1_100MS>>8;//0X80; //設初值
TMR1L==T1_100MS;//0X00;
TMR1IE=1; //TMR1中斷允許
T2CON=0x63; //TMR2 預分頻系數為1:16 ,后分頻系數為1:13,開始工作 關閉TRM2ON=0;
PR2=239; //TMR2的溢出值,當 TMR2 為此值+1時溢出
TMR2IE=1; //TMR1中斷允許 50MS
cnnt=0;
cnnt_timer=0;
num=10;
}
void Delay_MS(unsigned int t)
{
unsigned int a,b;
for(a=t;a>0;a--)
for(b=110;b>0;b--);
}
void Forward()
{
rise=1;
MOTB=1;
MOTA=0;
signal_key();
}
void Reversal()
{
rise=0;
MOTB=0;
MOTA=1;
signal_key();
}
void Stop()
{
MOTA=0;
MOTB=0;
}
unsigned int getkey()
{
if(!UP)
{
while(!UP)
{
if(cnnt==num){Stop();break;}
Forward();
}
}
if(!DN)
{
while(!DN)
{
if(cnnt==0){Stop();break;}
Reversal();
}
}
while(DN&&UP)
{
tmrh=0;
tmrl=0;
break;
}
}
unsigned int signal_key()
{
//---------------------- 信號下降沿檢測 --------------------------//
while(!RA2) //再次確認信號,沒有按下信號則退出
{
tmrh=0;
if(tmrl) break;
tmrl=1;
RA1=0;
INTF=0;
TMR1ON=0;
TMR2ON=1;
if(TMR2IF==1)//檢測是否50MS錯誤信號,停止運行
{
TMR2ON=0;
TMR2IF=0;
PR2=239; //設初值
Stop(); //停止電機運行
return;
}
}
//---------------------- 信號上升沿檢測 --------------------------//
while(RA2)
{
tmrl=0;
if(tmrh) break;
tmrh=1;
TMR2ON=0;
INTF=1;
if(TMR1IF==1)//檢測是否100MS錯誤信號,停止運行
{
TMR1ON=0;
TMR1IF=0;
TMR1H=T1_100MS>>8;//0X80; //設初值
TMR1L=T1_100MS;//0X00;
Stop(); //停止電機運行
return;
}
break;
}
//---------------------- 取出上升沿脈沖信號時間 --------------------------//
if(TMR1ON==0)
{
timerh=TMR1H;
timerl=TMR1L;
cnnt_timer = timerh<<8;
cnnt_timer += timerl;
TMR1IF=0;
TMR1H=T1_100MS>>8;//0X80; //設初值
TMR1L=T1_100MS;//0X00;
}
//---------------------- 取出下降沿脈沖信號時間 --------------------------//
if(TMR2ON==0)
{
cnnt_tmr2 = TMR2;
TMR2IF=0;
PR2=239; //設初值
}
}
void interrupt ISR(void)
{
if(INTF==1) //脈沖開始計數,同時開啟TMR1上升降計時
{
INTF=0;
RA1=1;
if(rise) cnnt++;
else cnnt--;
TMR1ON=1;
}
if( TMR1IF==1)
{
TMR1IF=0;
TMR1H=T1_100MS>>8;//0X80; //設初值
TMR1L=T1_100MS;//0X00;
}
if( TMR2IF==1)
{
TMR2IF=0;
PR2=239; //設初值
}
}
void main()
{
initial();
while (1)
{
getkey();
}
}
上一篇:pic單片機控制電機啟動、轉動、停止C語言程序
下一篇:超聲波PIC單片機C程序
推薦閱讀
史海拾趣
在拓展國內市場的同時,常州星海電子也積極開拓國際市場。公司的產品主要銷往歐洲地區、美國和亞洲各國,是MOTOROLA、YAMAHA、Samsung、VTECH、LG、NOKIA等跨國公司的二極管供應廠家。國外銷售量占公司總銷售量的60%以上,這一成績不僅體現了公司在國際市場上的競爭力,也為公司未來的發展奠定了堅實的基礎。
在拓展國內市場的同時,常州星海電子也積極開拓國際市場。公司的產品主要銷往歐洲地區、美國和亞洲各國,是MOTOROLA、YAMAHA、Samsung、VTECH、LG、NOKIA等跨國公司的二極管供應廠家。國外銷售量占公司總銷售量的60%以上,這一成績不僅體現了公司在國際市場上的競爭力,也為公司未來的發展奠定了堅實的基礎。
Crowd Supply的創立源于幾位麻省理工大學的畢業生對于硬件創新的熱情與追求。他們意識到,許多優秀的硬件項目因缺乏資金和市場渠道而無法實現商業化。于是,他們決定創建一個平臺,專門服務于這些創新項目,幫助它們從原型設計走向市場。這就是Crowd Supply的初心,也是其使命所在——將原創、有用、受人尊敬的硬件帶入生活。
EWC Controls公司非常重視人才培養和團隊建設。公司建立了一套完善的人才培養體系,通過內部培訓、外部引進等方式吸引和培養了一批高素質的人才。同時,公司還注重團隊合作和文化建設,鼓勵員工之間的交流和合作,營造了積極向上的工作氛圍。這種人才培養和團隊建設的策略為公司的發展提供了有力的保障。
為了進一步擴大在電子行業的市場份額,HEICO Corporation采取了積極的并購策略。例如,在2022年,公司宣布收購Accurate Metal Machining, Inc. 96%的股份,這是一家位于克利夫蘭的高可靠性組件制造商。此次收購為HEICO帶來了新產品和功能,增強了其在航空航天和國防領域的競爭力。通過并購,HEICO不僅獲得了先進的技術和人才,還拓寬了產品線,加速了其在電子行業的擴張步伐。
網上廣為流傳的ARM學習資料, 作者功務深厚, 精神可佳, 是學習ARM開發的上好資料, 其中包括"ARM學習報告003——Bios源碼分析.pdf","BootLoader源代碼級分析第一部分-GNU之映象機理.pdf","ARM映象文件及執行機理.rar"三部分組成. ...… 查看全部問答∨ |
|
愛因迪生:咦,又上來一位和色環電阻長得很像的元件。是誰呢?不過她長得很碩壯。為了再次出錯,我還是先驗證一下是不是電阻再說。 愛因迪生拿了個萬用表在手上,來到舞臺上。 愛因迪生:千萬別告訴我你是什么元件。我要自己猜猜。來來來,讓我量 ...… 查看全部問答∨ |
為了使大家對使用中或者使用過的PLC能有個總結,特征集討論三菱、西門子、歐姆龍最常用的3種PLC的使用心得。我本人用過最多的是三菱的FX、FX1N、FX2N系列PLC,感覺編寫程序容易,初學上手快,組網簡單,故障率低。希望大家也說說自己的工程和維修心 ...… 查看全部問答∨ |
autocorrelation(自相關)function 應該怎么用呢? 各位前輩,我是才剛剛開始接觸DSP(digital sound processing)的學生,現在要用autocorrelation funtion 找出一個periodic signal 的周期,但是實在是不知道autocorrelation function 應該怎么用~~~比方說我得到一個sinusoidal signal(有噪音) ...… 查看全部問答∨ |
在回答這個問題之前,麻煩大家能夠回答小弟的一個疑惑:一個控制器可以控制兩個LIN收發器嗎,也就是可以控制兩個LIN節點嗎? 如果可以,小弟現在有一個奇怪的問題: 基本情況: 從節點的地址是0x06,主節點發送一個報文頭,報文頭中的標識 ...… 查看全部問答∨ |
經過了前期的反復討論,決定使用MSP430G2333這個MCU去做一個新的產品,主要是應用到觸摸,10位AD,另外因需要的IO口也比較多的原因,決定用32個腳的QFN,于是一大早,就興沖沖的跑到華強/賽格去找樣。在來之 ...… 查看全部問答∨ |
|
Timing Summary: --------------- Speed Grade: -2 Minimum period: 7.205ns (Maximum Frequency: 138.793MHz) Minimum input arrival time before clock: 6.429ns Maximum output required time afte ...… 查看全部問答∨ |
今天將MDK423升級到了MDK460,發現原來在MDK423下編譯成功的工程,用MDK460打開編譯,會報N多錯誤,怎么解決啊???例如: ..\\lib\\stm32f10x_systick.c(50): error: #20: identifier "SysTick" is undefined; ..\\lib\\stm32f ...… 查看全部問答∨ |