单片机 10ms 4:1矩形波
时间: 2024-02-20 22:00:53 浏览: 39
以下是一个基于单片机的 C 代码,可以生成 10ms 4:1 的矩形波:
```c
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <stm32f10x.h>
#define SAMPLE_RATE 44100 // 采样率
#define PI 3.14159265358979323846
void TIM2_IRQHandler(void) {
if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) {
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
static uint16_t pulseWidth = SAMPLE_RATE / (4 * 440); // 脉宽
static uint16_t halfPulseWidth = pulseWidth / 2;
static uint16_t counter = 0;
if (counter < halfPulseWidth) {
GPIO_SetBits(GPIOA, GPIO_Pin_0);
} else {
GPIO_ResetBits(GPIOA, GPIO_Pin_0);
}
if (++counter >= pulseWidth) {
counter = 0;
}
}
}
int main(void) {
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
GPIO_InitTypeDef gpio;
gpio.GPIO_Pin = GPIO_Pin_0;
gpio.GPIO_Mode = GPIO_Mode_Out_PP;
gpio.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &gpio);
TIM_TimeBaseInitTypeDef tim;
tim.TIM_Period = SAMPLE_RATE / 100; // 自动重装载值,每10ms中断一次
tim.TIM_Prescaler = (SystemCoreClock / SAMPLE_RATE) - 1; // 预分频值
tim.TIM_ClockDivision = 0;
tim.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &tim);
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
NVIC_EnableIRQ(TIM2_IRQn);
TIM_Cmd(TIM2, ENABLE);
while (1) {
// do nothing
}
}
```
此代码使用单片机的定时器 TIM2 产生中断,根据 4:1 的占空比在每次中断时控制 GPIOA 的 Pin 0 输出高电平或低电平,从而生成矩形波形。你可以将该代码编译并下载到适当的单片机上,然后通过示波器等工具观察输出波形。
阅读全文