冰楓論壇

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

[討論] ATtiny2313/ATtiny24A

[複製鏈接]

2609

主題

0

好友

1003

積分

金牌會員

Rank: 6Rank: 6

UID
373967
帖子
8977
主題
2609
精華
0
積分
1003
楓幣
0
威望
980
存款
35699
贊助金額
0
推廣
0
GP
1205
閱讀權限
70
在線時間
459 小時
註冊時間
2023-1-12
最後登入
2024-12-17

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

跳轉到指定樓層
1
發表於 2023-4-17 03:47:29 |只看該作者 |倒序瀏覽
製作多通道示波器的程式碼:


#include <avr/io.h>
#include <avr/interrupt.h>

#define F_CPU 8000000UL
#define BAUD 9600
#define MYUBRR F_CPU/16/BAUD-1

volatile uint16_t adcValues[4][256]; // 存儲4個ADC通道的樣本數組
volatile uint8_t sampleIndex = 0; // 樣本索引,用於採樣4個ADC通道
volatile uint8_t sampleCounter = 0; // 定時器計數器,用於採樣4個ADC通道

void ADC_Init() {
    // 設置ADC
    ADMUX = (1 << ADLAR) | 0x00; // 選擇ADC0作為初始通道,並且左對齊結果
    ADCSRA = (1 << ADEN) | (1 << ADPS2) | (1 << ADPS0); // 啟用ADC,設置分頻器為32
}

void Timer1_Init() {
    // 設置定時器1
    TCCR1B |= (1 << WGM12); // 設置為CTC模式
    TCCR1B |= (1 << CS11); // 設置分頻器為8
    OCR1A = 199; // 設置比較值為199,這樣定時器週期為1微秒
    TIMSK |= (1 << OCIE1A); // 啟用定時器比較中斷
}

ISR(TIMER1_COMPA_vect) {
    // 定時器中斷處理程序
    if (sampleCounter == 0) {
        // 如果計數器為0,就採樣4個ADC通道
        ADMUX = (1 << ADLAR) | ((sampleIndex & 0x03) << 1); // 切換到下一個ADC通道
        ADCSRA |= (1 << ADSC); // 啟動ADC
        sampleIndex++;
        if (sampleIndex == 4) {
            // 如果已經採樣完畢,就重置樣本索引
            sampleIndex = 0;
        }
    }
    sampleCounter++;
    if (sampleCounter == 20) {
        // 如果計數器達到20,就重置計數器
        sampleCounter = 0;
    }
}

void USART_Init(unsigned int ubrr) {
    // 設置USART
    UBRRH = (unsigned char)(ubrr >> 8);
    UBRRL = (unsigned char)ubrr;
    UCSRB = (1 << TXEN); // 啟用傳輸
    UCSRC = (1 << URSEL) | (1 << UCSZ1) | (1 << UCSZ0); // 設置框架格式
}

void USART_Transmit(unsigned char data) {
    // 傳輸一個字節
    while (!(UCSRA & (1 <<UDRE))); // 等待緩衝區可用

UDR = data; // 將數據寫入緩衝區
}

int main(void) {
ADC_Init(); // 初始化ADC
Timer1_Init(); // 初始化定時器1
USART_Init(MYUBRR); // 初始化USART
sei(); // 啟用全局中斷
while (1) {
for (uint16_t i = 0; i < 256; i++) {
// 輸出採樣到的數據
USART_Transmit((adcValues[0][i] >> 2) & 0xFF); // ADC0通道
USART_Transmit((adcValues[1][i] >> 2) & 0xFF); // ADC1通道
USART_Transmit((adcValues[2][i] >> 2) & 0xFF); // ADC2通道
USART_Transmit((adcValues[3][i] >> 2) & 0xFF); // ADC3通道
}
}
}

ISR(ADC_vect) {
// ADC中斷處理程序
adcValues[ADMUX >> 1][sampleCounter] = ADC; // 存儲ADC值
}



需要的零件:
- ATtiny2313/ATtiny24A微控制器
- 4個光耦隔離的信號放大器模塊
- 4個類比數字轉換器 (ADC) 芯片
- 4個紅色LED
- 4個電阻
- 1個晶振
- 1個晶振負載電容
- 1個USB轉串口模塊
- 適當數量的杜邦線

連接方式:
- 將4個信號放大器模塊與4個ADC芯片連接,使其產生放大的ADC信號。
- 將4個ADC芯片的輸出連接到ATtiny2313/ATtiny24A微控制器的4個ADC輸入端口。
- 將4個紅色LED連接到ATtiny2313/ATtiny24A微控制器的4個輸出端口。
- 將晶振和負載電容連接到ATtiny2313/ATtiny24A微控制器的相應引腳。
- 將USB轉串口模塊的TX引腳連接到ATtiny2313/ATtiny24A微控制器的RX引腳,將RX引腳連接到ATtiny2313/ATtiny24A微控制器的TX引腳。
收藏收藏0 推0 噓0


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

廣告刊登意見回饋關於我們管群招募本站規範DMCA隱私權政策

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

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

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

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

GMT+8, 2024-12-17 13:37

回頂部