分享~
0.png (40.04 KB, 下載次數: 36)
下載附件
2017-8-9 17:51 上傳
單片機源程序如下:
- /*-----------------------------------------------
- 名稱: 直流電機控制
- 工作室: 翼嵌電子工作室
- 編寫: Bin.Lee
- 日期: 2018.6.10
- 版本: 0.1
- 內容: 直流電機的PWM速度控制程序
- 端口: IN_1 = P2^0;
- IN_2 = P2^1;
- IN_3 = P2^2;
- IN_4 = P2^3;
- EN_A = P2^4;
- EN_B = P2^5;
- ------------------------------------------------*/
- /* 電機控制函數 index-電機號(1,2); speed-電機速度(-100—100) direction-正反轉(1,0)*/
- #include "Motor.h"
- sbit IN_1 = P2^0; /* L298的IN_1 */
- sbit IN_2 = P2^1; /* L298的IN_2 */
- sbit IN_3 = P2^2; /* L298的IN_3 */
- sbit IN_4 = P2^3; /* L298的IN_4 */
- sbit EN_A = P2^4; /* L298的EN_A */
- sbit EN_B = P2^5; /* L298的EN_B */
- /**********電機驅動****************/
- uchar count = 0; /* 中斷計數器 */
- uchar Speed_1 = 0, Speed_2 = 0; /* 電機1/2速度值 */
- uchar Speed_Now_1 = 0, Speed_Now_2 = 0; /* 電機1/2當前速度值 */
- void Motor_Delay_ms(unsigned int time)
- {
- uchar i,j;
- for(i=time;i>0;i++)
- for(j=112;j>0;j--)
- {;}
- }
- void Motor(uchar index, char speed,uchar direction)
- {
- if(index == 1) /* 電機1的處理 */
- {
- if(direction == 1)
- {
- Speed_1 = speed;
- IN_1 = 1;
- IN_2 = 0;
- }
- else
- {
- Speed_1 = speed;
- IN_1 = 0;
- IN_2 = 1;
- }
- }
- if(index == 2) /* 電機2的處理 */
- {
- if(direction == 1)
- {
- Speed_2 = speed;
- IN_3 = 1;
- IN_4 = 0;
- }
- else
- {
- Speed_2 = speed; /* 電機2的速度控制 */
- IN_3 = 0;
- IN_4 = 1;
- }
- }
- }
- void Motor_Control_1(char speed, uchar direction)/* 電機1的控制 */
- {
- Motor(1, speed, direction);
- }
- void Motor_Control_2(char speed, uchar direction)/* 電機2的控制 */
- {
- Motor(2, speed, direction);
- }
- void Motor_Init(void)
- {
- IN_1 = 1;
- IN_2 = 1;
- IN_3 = 1;
- IN_4 = 1;
- TMOD = 0x02; /* 設定T0的工作模式為2 */
- TH0 = 0xa3; /* 裝入定時器的初值 */
- TL0 = 0xa3; //0.1ms
- EA = 1; /* 開中斷 */
- ET0 = 1; /* 定時器0允許中斷 */
- TR0 = 1; /* 啟動定時器0 */
- }
- /*********************行駛狀態**************************/
- void Motor_Run(void)
- {
- TR0 = 1; /* 啟動定時器0 */
- Motor_Delay_ms(2);
- Motor_Control_1(13, 1);
- Motor_Control_2(13, 0);
- }
- void Motor_Back(void)
- {
- TR0 = 1; /* 啟動定時器0 */
- Motor_Delay_ms(2);
- Motor_Control_1(30, 0);
- Motor_Control_2(30, 1);
- }
- void Motor_Stop(void)
- {
- Motor_Delay_ms(2);
- TR0 = 0; /* 關閉定時器0 */
- EN_A = 0;
- EN_B = 0;
- IN_1 = 0;
- IN_2 = 0;
- IN_3 = 0;
- IN_4 = 0;
- }
- void Motor_TurnRight(void) //右轉
- {
- TR0 = 1;
- Motor_Delay_ms(2);
- Motor_Control_1(15, 1);
- Motor_Control_2(10, 1);
- }
- void Motor_TurnLeft(void) //左轉
- {
- TR0 = 1;
- Motor_Delay_ms(2);
- Motor_Control_1(10, 0);
- Motor_Control_2(15, 0);
- }
- void Motor_Around(void) //打轉
- {
- TR0 = 1; /* 啟動定時器0 */
- Motor_Delay_ms(2);
- Motor_Control_1(10, 1);
- Motor_Control_1(10, 1);
- }
- void TIME_0(void) interrupt 1 /* T0中斷服務程序 */
- {
- if(count == 0) /* 1個PWM周期完成后才會接受新數值 */
- {
- Speed_Now_1 = Speed_1;
- Speed_Now_2 = Speed_1;
- }
- /* 產生電機1的PWM信號 */
- if(count < Speed_1) EN_A = 1;
- else EN_A = 0;
- /* 產生電機2的PWM信號 */
- if(count < Speed_2) EN_B = 1;
- else EN_B = 0;
- count++;
- if(count >= 100) count = 0; /* 1個PWM信號由100次中斷產 */
- }
復制代碼
所有資料51hei提供下載:
L298電機驅動程序.rar
(36.61 KB, 下載次數: 63)
2017-8-9 14:37 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|