危機處理-外部中斷作業
各位同學來寫作業囉!!!
基本上就是做一個倒車雷達的概念
而範例檔已經很佛的幫你寫好了超音波測距跟馬達轉動還有蜂鳴器的程式碼
所以基本上就用裡面的distance變數去判定距離
然後再用上次課堂作業的概念(時間中斷的frequency)去控制馬達轉速跟蜂鳴器的頻率
距離判斷: 用很簡單的if/else
if(n==0){
TIMER0->TCMPR = 2000000;
}
if(n==1){
TIMER0->TCMPR = 1000000;
}
if(n==2){
TIMER0->TCMPR = 500000;
}
if(m==3){
TIMER0->TCMPR = 0;
}
外部中斷:
m為判斷外部中斷是否啟動的變數
void EINT1Callback(void)
{
m=3;
//顯示警報以及三短音
print_lcd(3,"ALARM!!");
for(int i=0;i<3;i++){
DrvGPIO_ClrBit(E_GPB,11);
DrvSYS_Delay(85000);
DrvGPIO_SetBit(E_GPB,11);
DrvSYS_Delay(250000);
}
/*for(int i=0;i<4;i++){
DrvSYS_Delay(250000);
}*/
print_lcd(3," ");
}
馬達控制:
void TMR1_IRQHandler(){
TIMER1->TISR.TIF = 1; // clear Interrupt flag
//轉速控制
if(n==0||n==3){
TIMER1->TCMPR = 1250; //800Hz
}
if(n==1){
TIMER1->TCMPR = 2500; //400Hz
}
if(n==2){
TIMER1->TCMPR = 10000; //100Hz
}
//正反轉控制
if(m==3){
cnt++;
if(cnt<2048){
step_cnt--;
if(step_cnt<=0) step_cnt=8;
Step_Motor(step_cnt);
}
else{
m=0;
cnt=0;
}
}
else{
step_cnt++;
if(step_cnt>=8) step_cnt=0;
Step_Motor(step_cnt);
}
蜂鳴器控制:
void TMR0_IRQHandler(void){
TIMER0->TISR.TIF = 1; // clear Interrupt flag
DrvGPIO_ClrBit(E_GPB,11);
DrvSYS_Delay(50000);
DrvGPIO_SetBit(E_GPB,11);
if(n==0){
TIMER0->TCMPR = 2000000;
}
if(n==1){
TIMER0->TCMPR = 1000000;
}
if(n==2){
TIMER0->TCMPR = 500000;
}
if(m==3){
TIMER0->TCMPR = 0;
}
}
壓縮檔下次再傳啊呵呵!
留言
張貼留言