冰楓論壇

標題: ATtiny2313/ATtiny24A [打印本頁]

作者: 洪嵐峰    時間: 2023-4-17 03:47
標題: ATtiny2313/ATtiny24A
製作多通道示波器的程式碼:


#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引腳。




歡迎光臨 冰楓論壇 (https://bingfong.com/) Powered by 冰楓