欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
基于51單片機和L298N的小車制作
[打印本頁]
作者:
dccc
時間:
2018-9-27 21:38
標題:
基于51單片機和L298N的小車制作
到目前為止, 總算把51單片機過了一遍, 本來暑假就要完成的任務一直拖到了現在。 51學完, 就想著先做點東西, 就從小車開始。
玩小車最重要的是什么? 電機。這個就不用多解釋了。 從今天早上開始到現在 總算是知道點皮毛了。 因為有學長做過這東西, 所以做起來也有大概的方向 知道是要搞哪些東西。 現在主要是L298N電機驅動和PWM脈沖控制。
什么是L298N電機驅動? 什么是PWM脈沖?
一開始我一無所知, 實驗室里面有L298N驅動 但是我只知道它是L298N驅動, 對于怎么使用卻是一點也不知道。 在網上找教程, 淘寶上找資料; 掙扎了一個上午總算是知道了L298N驅動怎么使用, 相應I/O口的含義以及用途。 給一個傳送門:我是L298N驅動資料地址:
L298N_電機驅動模塊_程序書.doc
(1.13 MB, 下載次數: 38)
2018-9-28 02:54 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
那什么是PWM呢? PWM是脈沖寬度調制, 在電機方面主要是通過改變占空比來改變電機的轉速, 從而實現加速、減速、轉彎等基本功能。 什么是占空比? 占空比指的是一個周期內, 高電平占這個周期的比例。 占空比越高,
電壓輸出就越高, 電機轉動的就越快。
在飛思卡爾、stm32 等芯片中有專門的模塊用來控制PWM, 但是在51單片機中則沒有, 所以需要用到內部的定時器來實現, 相對來說比較麻煩。 關于51單片機輸出PWM波可以參考一下這篇文章:
如果利用51單片機輸出PWM波
。
我感覺這個網站對現在我也挺好的。
代碼部分:
程序一: 通過P2^0和P2^1口來控制電機的轉動, 通過按鍵來控制電機轉動的快慢。
#include <reg52.h>
typedef unsigned int u16;
typedef unsigned char u8;
sbit PWM1 = P2^0;
sbit PWM2 = P2^1;
sbit key_add = P3^2;
sbit key_less = P3^3;
u16 count = 50, time;
void init0()
{
TMOD = 0x01; // 方式一
TH0 = (65536 - 10)/256; // 賦初值
TL0 = (65536 - 10)%256;
TR0 = 1; // 開啟定時器0
EA = 1; // 開啟總中斷
ET0 = 1; // 定時器0允許中斷
}
void delayms(u16 z) // 延遲函數
{
u16 i, j;
for (i = z; i > 0; i--)
for (j = 110; j > 0; j--);
}
void speed_add() // 加速函數
{
if (key_add == 0)
{
delayms(2);
if (key_add == 0)
{
count += 5; // 通過改變占空比來進行加速
}
while (!key_add);
}
}
void speed_less()//減速函數
{
if (key_less == 0)
{
delayms(2);
if (key_less == 0)
{
count -= 5;
}
while (!key_less);
}
}
int main (void)
{
init0();
while (1)
{
speed_add();
speed_less();
}
return 0;
}
void T0_inter() interrupt 1
{
TR0 = 0;
TH0 = (65536 - 10)/256;
TL0 = (65536 - 10)%256;
TR0 = 1;
PWM1 = 0;
time ++ ;
if (time < count)// 因為總數是100, 所以可以直接看出占空比是多少。
{
PWM2 = 1;
}
else
{
PWM2 = 0;
}
if (time >= 100)
{
time = 0;
}
}
復制代碼
程序2:
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
uchar time,count=50,flag=1;//低電平的占空比
sbit PWM1=P2^0;//PWM 通道 1
sbit PWM2=P2^1;//PWM 通道 2
sbit key_turn=P3^3; //電機換向
void delayxms(uint z);
void Motor_turn(void);
void timer0_init(void);
void main(void)
{
timer0_init();
while(1)
{
Motor_turn();
}
}
void delayxms(uint z)//延時xms程序
{
uint x,y;
for(y=z;x>0;x--)
for(y=110;y>0;y--);
}
/***電機正反向控制****/
void Motor_turn(void)
{
if(key_turn==0)
{
delayxms(2);//此處時間不能太長,否者會的中斷產生沖突
if(key_turn==0)
{
flag=~flag;
}
while(!key_turn);
}
}
/***********定時器0初始化***********/
void timer0_init(void)
{
TMOD=0x01; //定時器0工作于方式1
TH0=(65536-10)/256; // 賦初值
TL0=(65536-10)%256;
TR0=1; // 開啟定時器
ET0=1; // 允許定時器0中斷
EA=1; // 開啟總中斷
}
/**************定時0中斷處理******************/
void timer0_int(void) interrupt 1
{
TR0=0;//設置定時器初值期間,關閉定時器
TH0=(65536-10)/256;
TL0=(65536-10)%256;
TR0=1;
if(flag==1)//電機正轉
{
PWM1=0;
time++;
if(time<count) //占空比
{
PWM2=1;
}
else
{
PWM2=0;
}
if(time>=100)
{
time=0;
}
}
else //電機反轉
{
PWM2=0;
time++;
if(time<count)
{
PWM1=1;
}
else
{
PWM1=0;
}
if(time>=100)
{
time=0;
}
}
}
復制代碼
作者:
dccc
時間:
2018-9-27 21:40
謝謝樓主
作者:
skorzeny
時間:
2018-10-4 15:55
好東西
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1