洪嵐峰 發表於 2023-4-20 04:26:15

Renesas RX113

製作一個多通道示波器需要以下零件:

Renesas RX113 微控制器板 (RX113-ek)

8 位元串聯至並行型態轉換晶片 (74HC165)

雙向直流電壓轉換器模組 (MAX485)

4.3 吋 TFT LCD 顯示屏

10K 歐姆可變電阻器

電阻器和電容器

透過 Renesas RX113 微控制器板進行編程:


#include <stdbool.h>
#include <stdint.h>
#include "platform.h"
#include "r_cg_timer.h"
#include "r_cg_adc.h"
#include "r_cg_port.h"
#include "r_cg_cgc.h"

#define MAX_SAMPLES 4096

volatile uint16_t samples;
volatile uint16_t sample_count = 0;

void setup() {
    R_ADC_Create();
    R_ADC_Set_OperationOn();
    R_ADC_Set_Result(ADC_AN000, ADC_RES_FIFO_16, 1);
    R_ADC_Start();
   
    R_PORT_Create();
    R_PORT_Set_GPIO(PDL_NO, PDL_GPIO_OUTPUT);
    R_PORT_Write(GPIO_PD1_PIN, 0);
   
    R_CGC_Create();
    R_CGC_Set_MainClkSrc(CGC_CLK_SRC_HOCO);
    R_CGC_Set_HocoDiv(CGC_HOCODIV_2);
    R_CGC_Start();
   
    R_TAU0_Create();
    R_TAU0_Channel0_Start();
   
    R_SAU0_Create();
    R_SAU0_Start();
}

void loop() {
    while (sample_count < MAX_SAMPLES) {
        while (!R_ADC_Get_Result(ADC_RES_FIFO_16, &samples));
        sample_count++;
    }
   
    R_TAU0_Channel0_Stop();
   
    uint16_t max_sample = 0;
    for (uint16_t i = 0; i < MAX_SAMPLES; i++) {
        if (samples > max_sample) {
            max_sample = samples;
        }
    }
   
    for (uint16_t i = 0; i < MAX_SAMPLES; i++) {
        samples = samples * 4096 / max_sample;
    }
   
    R_PORT_Write(GPIO_PD1_PIN, 1);
    for (uint16_t i = 0; i < MAX_SAMPLES; i++) {
        while (!R_SAU0_Send((uint8_t*)&samples, 2));
    }
    R_PORT_Write(GPIO_PD1_PIN, 0);
   
    sample_count = 0;
    R_TAU0_Channel0_Start();
}

void main(void) {
    setup();
    while (true) {
        loop();
    }
}
這個程式碼使用 Renesas RX113 微控制器板的 ADC 功能,從模擬輸入中讀取樣本。

然後使用 TAU0 定時器計算每個樣本的最大值,以便進行垂直縮放。

最後,使用 SAU0 串列通訊介面將樣本數據傳輸到外部顯示器顯示。

程式碼中的 GPIO_PD1_PIN 定義了控制 MAX485 轉換器的引腳,以便在傳輸數據時開啟/關閉。
頁: [1]
查看完整版本: Renesas RX113