冰楓論壇

 找回密碼
 立即註冊
ads_sugarbook
搜索
查看: 544|回覆: 0
打印 上一主題 下一主題

[討論] ATMEGA328P、ATtiny85、L293D

[複製鏈接]

2609

主題

0

好友

946

積分

高級會員

Rank: 4

UID
373967
帖子
7430
主題
2609
精華
0
積分
946
楓幣
1135
威望
926
存款
26000
贊助金額
0
推廣
0
GP
1205
閱讀權限
50
在線時間
407 小時
註冊時間
2023-1-12
最後登入
2024-5-3

2023端午節紀念勳章 2023中秋節紀念勳章 2023聖誕節紀念勳章

跳轉到指定樓層
1
發表於 2023-4-11 05:48:35 |只看該作者 |倒序瀏覽
ATMEGA328P、ATtiny85和L293D可以組合成一個更複雜的直流電機控制系統,可以實現更多的功能,例如控制多個電機、使用傳感器控制電機運行、通過無線通信控制電機等。

下面是一個可能的示例應用:

所需零件:

ATMEGA328P微控制器
ATtiny85微控制器
L293D電機驅動芯片
兩個直流電機
HC-SR04超聲波傳感器
NRF24L01無線模塊
9V電池或USB供電線
杜邦線
連接腳位:

連接ATMEGA328P和L293D:
ATMEGA328P的PD3引腳連接到L293D的IN1引腳,用來控制第一個電機的旋轉方向。
ATMEGA328P的PD5引腳連接到L293D的IN2引腳,用來控制第二個電機的旋轉方向。
ATMEGA328P的PD6引腳連接到L293D的ENA1引腳,用來控制第一個電機的轉速。
ATMEGA328P的PD7引腳連接到L293D的ENA2引腳,用來控制第二個電機的轉速。
ATMEGA328P的VCC引腳連接到L293D的VCC1引腳,提供電源。
ATMEGA328P的GND引腳連接到L293D的GND引腳,提供接地。
連接ATtiny85和L293D:
ATtiny85的PB1引腳連接到L293D的IN3引腳,用來控制第三個電機的旋轉方向。
ATtiny85的PB0引腳連接到L293D的ENA3引腳,用來控制第三個電機的轉速。
ATtiny85的VCC引腳連接到L293D的VCC2引腳,提供電源。
ATtiny85的GND引腳連接到L293D的GND引腳,提供接地。
連接超聲波傳感器:
將HC-SR04的Trig引腳連接到ATMEGA328P的PD2引腳。
將HC-SR04的Echo引腳連接到ATMEGA328P的PD4引腳。
連接無線模塊:
將NRF24L01的CE引腳連接到ATMEGA328P的PD9引腳。
將NRF24L01的CSN引腳連接到ATMEGA328P的PD10引腳。
將NRF24L01的MOSI引腳連接到ATMEGA328P的PB3引腳。
將NRF24L01的MISO引腳連接到ATME

ATMEGA328P和ATtiny85和L293D智能直流電機控制器的程序代碼可能如下所示:


// ATMEGA328P

#define F_CPU 16000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
#include "nRF24L01.h"
#include "nRF24L01-mnemonics.h"
#include "spi.h"

#define CE_PIN 1
#define CSN_PIN 2

void init_nrf24l01(void)
{
    _delay_ms(50);
    nRF24L01_CE_LOW;
    nRF24L01_CSN_HIGH;
    _delay_ms(10);
    spi_init_master();
    _delay_ms(10);
    nRF24L01_CE_HIGH;
    _delay_ms(10);
    spi_write_register(CONFIG, 0b00001110);
    spi_write_register(EN_AA, 0b00000000);
    spi_write_register(EN_RXADDR, 0b00000001);
    spi_write_register(SETUP_AW, 0b00000011);
    spi_write_register(SETUP_RETR, 0b00111111);
    spi_write_register(RF_CH, 0b00000111);
    spi_write_register(RF_SETUP, 0b00001110);
    spi_write_register(STATUS, 0b01110000);
    spi_write_register(RX_ADDR_P0, 0xE7E7E7E7E7);
    spi_write_register(RX_PW_P0, 0x01);
    spi_write_register(PIPE_STATUS, 0b00111111);
    spi_write_register(CONFIG, 0b00001111);
    _delay_ms(10);
}

void nrf24l01_send(uint8_t* data)
{
    nRF24L01_CE_LOW;
    spi_write_tx_payload(data, 32);
    nRF24L01_CE_HIGH;
    _delay_us(10);
    nRF24L01_CE_LOW;
    spi_write_register(STATUS, (1 << TX_DS));
}

int main(void)
{
    DDRD = 0b11111110;
    PORTD = 0b00000001;
    init_nrf24l01();
    while (1) {
        uint8_t data[32];
        memset(data, 0, sizeof(data));
        sprintf(data, "ATMEGA328P sends message");
        nrf24l01_send(data);
        _delay_ms(1000);
    }
    return 0;
}

// ATtiny85

#define F_CPU 8000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <stdint.h>
#include "spi.h"
#include "nRF24L01.h"
#include "nRF24L01-mnemonics.h"

#define CE_PIN 1
#define CSN_PIN 2

void init_nrf24l01(void)
{
    _delay_ms(50);
    nRF24L01_CE_LOW;
    nRF24L01_CSN_HIGH;
    _delay_ms(10);
    spi_init_master();
    _delay_ms(10);
    nRF24L01_CE_HIGH;
    _delay_ms(10);
    spi_write_register(CONFIG, 0b00001110);
    spi_write_register(EN_AA, 0b00000000);
    spi_write_register(EN_RXADDR, 0b00000001);
    spi_write_register(SETUP_AW, 0b00000011);
    spi_write_register(SETUP_RETR, 0b00111111);

spi_write_register(RF_CH, 0b00000111);
spi_write_register(RF_SETUP, 0b00001110);
spi_write_register(STATUS, 0b01110000);
spi_write_register(RX_ADDR_P0, 0xE7E7E7E7E7);
spi_write_register(RX_PW_P0, 0x01);
spi_write_register(PIPE_STATUS, 0b00111111);
spi_write_register(CONFIG, 0b00001111);
_delay_ms(10);
}

int main(void)
{
DDRB |= (1 << PB0) | (1 << PB1);
init_nrf24l01();
while (1) {
if (nRF24L01_data_received()) {
uint8_t data[32];
memset(data, 0, sizeof(data));
nRF24L01_get_data(data);
if (strcmp(data, "ATMEGA328P sends message") == 0) {
PORTB |= (1 << PB0);
_delay_ms(500);
PORTB &= ~(1 << PB0);
_delay_ms(500);
PORTB |= (1 << PB1);
_delay_ms(500);
PORTB &= ~(1 << PB1);
}
}
_delay_ms(10);
}
return 0;
}

// L293D

#define F_CPU 16000000UL
#include <avr/io.h>
#include <util/delay.h>

int main(void)
{
DDRC = 0b00000111;
PORTC = 0;
while (1) {
PORTC = 0b00000101;
_delay_ms(1000);
PORTC = 0b00000000;
_delay_ms(1000);
PORTC = 0b00001010;
_delay_ms(1000);
PORTC = 0b00000000;
_delay_ms(1000);
}
return 0;
}



此程序代碼用於控制直流電機並與ATMEGA328P和ATtiny85通信,使用nRF24L01無線收發器進行通信。 ATMEGA328P用於向ATtiny85發送消息,ATtiny85在接收到消息時會控制L293D以驅動直流電機運行。

L293D用於控制直流電機的旋轉方向。
收藏收藏1 推0 噓0


把本文推薦給朋友或其他網站上,每次被點擊增加您在本站積分: 1骰子
複製連結並發給好友,以賺取推廣點數
簡單兩步驟,註冊、分享網址,即可獲得獎勵! 一起推廣文章換商品、賺$$
高級模式
B Color Image Link Quote Code Smilies |上傳

廣告刊登意見回饋關於我們職位招聘本站規範DMCA隱私權政策

Copyright © 2011-2024 冰楓論壇, All rights reserved

免責聲明:本網站是以即時上載留言的方式運作,本站對所有留言的真實性、完整性及立場等,不負任何法律責任。

而一切留言之言論只代表留言者個人意見,並非本網站之立場,用戶不應信賴內容,並應自行判斷內容之真實性。

小黑屋|手機版|冰楓論壇

GMT+8, 2024-5-4 03:16

回頂部