使用定時器中斷做的簡單的pwm電機調速仿真使用l289電機驅動實現
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
單片機源程序如下:
- PWMH DATA 30H ;占空比
- PWM DATA 31H ;周期長度(pwm*250us)
- COUNTER EQU R0 ;計數器計數
- TEMP DATA 33H ;暫存
- IN1 EQU P1.2
- IN2 EQU P1.3
- ORG 0000H
- LJMP MAIN
- ORG 000BH
- LJMP INTT0
- ORG 0030H
- MAIN:
- MOV SP,#60H
- MOV PWMH,#4 ;占空比初值
- MOV COUNTER,#11;計數器初值
- MOV PWM,#11 ;周期初值
- MOV TMOD,#02H ;定時器0,工作模式2
- MOV TL0,#06H ;定時250us
- MOV TH0,#06H ;自動重裝初值
- SETB ET0 ;開定時器中斷
- SETB EA ;開總中斷
- SETB TR0 ;啟動定時器
- CLR IN1
- CLR IN2
- KSCAN:
- JNB P2.0,K1CHECK ;掃描加速鍵
- JNB P2.1,K2CHECK ;掃描減速鍵
- JNB P2.2,K3CHECK ;掃描啟動鍵
- JNB P2.3,K4CHECK ;掃描停止鍵
- SJMP KSCAN
- K1CHECK:
- LCALL DELAY
- JB P2.0,KSCAN ;延時去抖
- BACK1:
- JNB P2.0,BACK1;等待按鍵松開
- SJMP K1HANDLE;跳轉處理子程序
- K1HANDLE:
- MOV A,PWMH
- CJNE A,PWM,K1H0 ;判斷是否達到上邊界
- SJMP KSCAN ;達到最大,無法增加,不做處理
- K1H0:
- MOV A,PWMH ;未到最大
- INC A
- MOV PWMH,A ;占空比未到最大
- SJMP KSCAN
- K2CHECK:
- LCALL DELAY
- JB P2.1,KSCAN ;延時去抖
- BACK2:
- JNB P2.1,BACK2;等待按鍵松開
- SJMP K2HANDLE;跳轉處理子程序
- K2HANDLE:
- MOV A,PWMH
- CJNE A,#02H,K2H0 ;判斷是否達到下邊界
- SJMP KSCAN ;達到最小,無法減小,不做處理
- K2H0:
- MOV A,PWMH ;未到最小
- DEC A
- MOV PWMH,A ;
- SJMP KSCAN
- K3CHECK:
- LCALL DELAY
- JB P2.2,KSCAN ;延時去抖
- BACK3:
- JNB P2.2,BACK3;等待按鍵松開
- SJMP K3HANDLE;跳轉處理子程序
- K3HANDLE:
- SETB IN1
- CLR IN2;電機正轉
- SJMP KSCAN
- K4CHECK:
- LCALL DELAY
- JB P2.3,KSCAN ;延時去抖
- BACK4:
- JNB P2.3,BACK4;等待按鍵松開
- SJMP K4HANDLE;跳轉處理子程序
- K4HANDLE:
- CLR IN1
- CLR IN2;電機反轉
- SJMP KSCAN
- DELAY:
- PUSH PSW;
- MOV R6,#09FH;
- D1: MOV R7,#0F9H;
- D2: DJNZ R7,D2;
- DJNZ R6,D1;
- POP PSW;
- RET
- INTT0: ;定時器中斷函數
- PUSH PSW
- PUSH ACC
- DJNZ COUNTER,INTT01 ;達到一個周期
- MOV COUNTER,#10
- INTT01:
- CLR C
- MOV A,COUNTER
- CJNE A,PWMH,INTT02 ;判斷pwm條件,counter<pwmh,c=1
- INTT02:
- JC HLEVEL ;counter<pwmh
- CLR P1.0
- SJMP OUT
- HLEVEL:
- SETB P1.0
- OUT:
- POP ACC
- POP PSW
- RETI
- END;
復制代碼
.dsn文件是Proteus7.5版本的仿真圖,大家要用7.5才能打開哦,,asm是匯編代碼,大家自行創建Keil工程然后添加進去
上圖資料51hei附件下載:
PWM.rar
(10.74 KB, 下載次數: 45)
2021-9-20 14:30 上傳
點擊文件名下載附件
|