一、任务
设计并制作一个数字显示的周期性矩形脉冲信号参数测量仪,其输入阻抗为 50Ω。同时设计并制作一个标准矩形脉冲信号发生器,作为测试仪的附加功能。
二·、要求
三、说明
GPT-4o给出的设计方案:
设计一个测量脉冲信号频率、占空比、幅度和上升时间的数字显示测量仪,利用微控制器(MCU)采集脉冲信号数据,并进行处理和显示。此外,设计一个标准矩形脉冲信号发生器,用于测试仪的校准。
信号采集模块:
数据处理模块:
信号发生模块:
频率测量:
占空比测量:
幅度测量:
上升时间测量:
信号调理:
ADC模块:
频率计数:
STM32 MCU:
ADC:
高精度晶振:
// STM32 MCU Pulse Measurement Code
#include "stm32f4xx_hal.h"
TIM_HandleTypeDef htim;
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_TIM_IC_Init(void);
static void MX_ADC_Init(void);
int main(void) {
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_TIM_IC_Init();
MX_ADC_Init();
HAL_TIM_IC_Start_IT(&htim, TIM_CHANNEL_1);
while (1) {
// 主循环:读取和处理采集到的数据
}
}
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) {
if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1) {
// Capture frequency and duty cycle with timer
uint32_t IC_Val1 = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1);
uint32_t IC_Val2 = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1);
uint32_t Difference = IC_Val2 - IC_Val1;
float frequency = HAL_RCC_GetPCLK1Freq() / Difference;
// Process and display frequency and duty cycle
}
}
static void MX_TIM_IC_Init(void) {
htim.Instance = TIM2;
htim.Init.Prescaler = 84-1;
htim.Init.CounterMode = TIM_COUNTERMODE_UP;
htim.Init.Period = 0xFFFF;
HAL_TIM_IC_Init(&htim);
TIM_IC_InitTypeDef sConfigIC = {0};
sConfigIC.ICPolarity = TIM_ICPOLARITY_RISING;
sConfigIC.ICSelection = TIM_ICSELECTION_DIRECTTI;
sConfigIC.ICPrescaler = TIM_ICPSC_DIV1;
sConfigIC.ICFilter = 0;
HAL_TIM_IC_ConfigChannel(&htim, &sConfigIC, TIM_CHANNEL_1);
}
static void MX_ADC_Init(void) {
ADC_ChannelConfTypeDef sConfig = {0};
hadc1.Instance = ADC1;
hadc1.Init.Resolution = ADC_RESOLUTION_12B;
HAL_ADC_Init(&hadc1);
sConfig.Channel = ADC_CHANNEL_0;
sConfig.Rank = 1;
sConfig.SamplingTime = ADC_SAMPLETIME_3CYCLES;
HAL_ADC_ConfigChannel(&hadc1, &sConfig);
}
void SystemClock_Config(void) {
// 系统时钟配置代码
}
static void MX_GPIO_Init(void) {
// GPIO初始化代码
}
module pwm_generator (
input clk, // 输入时钟
input [7:0] duty, // 占空比设定
output reg pwm // PWM信号输出
);
reg [7:0] counter = 0;
always @(posedge clk) begin
counter <= counter + 1;
if(counter < duty)
pwm <= 1;
else
pwm <= 0;
end
endmodule
这个题目考察的主要知识点: