- UID
- 373967
- 帖子
- 8977
- 主題
- 2609
- 精華
- 0
- 積分
- 1003
- 楓幣
- 0
- 威望
- 980
- 存款
- 35699
- 贊助金額
- 0
- 推廣
- 0
- GP
- 1205
- 閱讀權限
- 70
- 在線時間
- 459 小時
- 註冊時間
- 2023-1-12
- 最後登入
- 2024-12-17
|
製作多通道示波器的程式碼:
#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引腳。 |
|