洪嵐峰 發表於 2023-4-12 21:11:43

MB9XFxxx

MB9XFxxx是一種微控制器,可以用來製作示波器

所需零件:

MB9XFxxx微控制器
示波器顯示屏
示波器探頭
電容和電阻器
杜邦線
電源模組
連結腳位:

示波器顯示屏:通常使用SPI接口連接到微控制器
示波器探頭:接到微控制器的ADC輸入引腳
電容和電阻器:用於濾波和增益控制,連接到微控制器的GPIO引腳
電源模組:用於提供電源給微控制器和顯示屏
以下是一個使用 MB9XFxxx 微控制器實現示波器的程式碼範例:

c

#include "mb9xfxxx.h"
#include "lcd.h"
#include "adc.h"
#include "math.h"

// 定義 ADC 通道和採樣點數
#define ADC_CH          ADC_CH0
#define ADC_SAMPLE_NUM  256

// 定義屏幕寬度和高度
#define SCREEN_WIDTH    320
#define SCREEN_HEIGHT   240

// 定義水平和垂直方向縮放比例
#define H_SCALE         2
#define V_SCALE         2

// 定義緩存區大小
#define BUFFER_SIZE     (SCREEN_WIDTH / H_SCALE)

// 定義波形數據緩存區
uint16_t buffer;

// 定義採樣完成標誌
volatile bool sample_complete = false;

// ADC 中斷處理函數
void ADC_IRQHandler(void)
{
    // 讀取 ADC 轉換結果
    uint16_t result = ADC_GetResult(ADC_CH);

    // 將結果存入緩存區
    static uint16_t index = 0;
    buffer = result;

    // 檢查是否完成採樣
    if (index >= BUFFER_SIZE)
    {
        sample_complete = true;
        index = 0;
    }
}

int main(void)
{
    // 初始化 LCD
    LCD_Init(SCREEN_WIDTH, SCREEN_HEIGHT);

    // 初始化 ADC
    ADC_Init(ADC_CH, ADC_SAMPLE_NUM);

    // 註冊 ADC 中斷處理函數
    NVIC_EnableIRQ(ADC_IRQn);

    // 啟用 ADC 中斷
    ADC_EnableIRQ();

    while (1)
    {
        // 等待採樣完成
        while (!sample_complete);

        // 重置採樣完成標誌
        sample_complete = false;

        // 清空屏幕
        LCD_ClearScreen();

        // 計算縮放後的高度
        uint16_t scaled_height = SCREEN_HEIGHT / V_SCALE;

        // 繪製波形
        for (int i = 0; i < BUFFER_SIZE - H_SCALE; i += H_SCALE)
        {
            // 計算每個縮放區間的平均值
            uint32_t sum = 0;
            for (int j = i; j < i + H_SCALE; j++)
            {
                sum += buffer;
            }
            uint16_t average = sum / H_SCALE;

            // 計算縮放後的波形高度
            uint16_t height = (uint16_t)(scaled_height * (average / 4096.0));

            // 繪製波形
            LCD_DrawLine(i / H_SCALE, SCREEN_HEIGHT - height, (i + H_SCALE) / H_SCALE, SCREEN_HEIGHT - height);
        }
    }
}
頁: [1]
查看完整版本: MB9XFxxx