- UID
- 373967
- 帖子
- 9026
- 主題
- 2609
- 精華
- 0
- 積分
- 1009
- 楓幣
- 0
- 威望
- 986
- 存款
- 35994
- 贊助金額
- 0
- 推廣
- 0
- GP
- 1205
- 閱讀權限
- 70
- 在線時間
- 461 小時
- 註冊時間
- 2023-1-12
- 最後登入
- 2024-12-25
|
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用於控制直流電機的旋轉方向。 |
|