当前位置: 首页 > news >正文

STM32项目实战:正弦波

        波形发生器对我的钱包不怎么友好,手里面有stm32f103c8t6,于是就想,放在哪儿吃灰也是吃灰,不如做个正弦波发生器。

方案 

        dac没怎么用过,所以打算使用输出模拟正弦波。

        我们决定采用以下方案:
1.使用TIM2_CH3(PA2)输出PWM
2.使用TIM4产生中断来更新占空比
3.系统时钟72MHz

代码

        以下为完整的项目代码实现:

#include "stm32f10x.h"
#include "math.h"#define PI 3.14159265f
#define SAMPLE_POINTS 256    // 正弦波采样点数
#define PWM_FREQ 10000      // PWM频率10kHz
#define SINE_FREQ 1000      // 正弦波频率1kHzuint16_t sineWave[SAMPLE_POINTS]; // 正弦波采样值
uint8_t waveIndex = 0;            // 当前采样点索引// 生成正弦波查找表
void generateSineTable(void) {for(int i = 0; i < SAMPLE_POINTS; i++) {float radian = 2 * PI * i / SAMPLE_POINTS;float value = 0.5f * (1 + sinf(radian));  // 值域[0,1]sineWave[i] = (uint16_t)(value * 999);    // 映射到0-999(TIM2->ARR=999)}
}// TIM4初始化(中断触发占空比更新)
void TIM4_Init(void) {RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);TIM_TimeBaseInitTypeDef TIM_TimeBaseStruct;TIM_TimeBaseStruct.TIM_Period = (72000000 / (SINE_FREQ * SAMPLE_POINTS)) - 1; // 中断频率 = 正弦波频率×采样点数TIM_TimeBaseStruct.TIM_Prescaler = 0;     // 72MHz/1 = 72MHzTIM_TimeBaseStruct.TIM_ClockDivision = TIM_CKD_DIV1;TIM_TimeBaseStruct.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStruct);TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE);TIM_Cmd(TIM4, ENABLE);
}// TIM2 PWM初始化(PA2输出)
void TIM2_PWM_Init(void) {RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);// PA2配置为复用推挽输出GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Pin = GPIO_Pin_2;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStruct);// 时基配置(PWM频率)TIM_TimeBaseInitTypeDef TIM_TimeBaseStruct;TIM_TimeBaseStruct.TIM_Period = 999;               // ARR值(0-999对应占空比0-100%)TIM_TimeBaseStruct.TIM_Prescaler = 7200 - 1;       // 72MHz/7200 = 10kHzTIM_TimeBaseStruct.TIM_ClockDivision = 0;TIM_TimeBaseStruct.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStruct);// PWM通道3配置(PA2对应TIM2_CH3)TIM_OCInitTypeDef TIM_OCStruct;TIM_OCStruct.TIM_OCMode = TIM_OCMode_PWM1;TIM_OCStruct.TIM_OutputState = TIM_OutputState_Enable;TIM_OCStruct.TIM_OCPolarity = TIM_OCPolarity_High;TIM_OCStruct.TIM_Pulse = 0;                         // 初始占空比TIM_OC3Init(TIM2, &TIM_OCStruct);TIM_OC3PreloadConfig(TIM2, TIM_OCPreload_Enable);TIM_ARRPreloadConfig(TIM2, ENABLE);TIM_Cmd(TIM2, ENABLE);
}// TIM4中断服务程序(更新占空比)
void TIM4_IRQHandler(void) {if (TIM_GetITStatus(TIM4, TIM_IT_Update) == SET) {TIM_SetCompare3(TIM2, sineWave[waveIndex]); // 更新PA2占空比waveIndex = (waveIndex + 1) % SAMPLE_POINTS;TIM_ClearITPendingBit(TIM4, TIM_IT_Update);}
}int main(void) {// 系统时钟初始化SystemInit();// 关键修复:禁用JTAG释放PA15/PB3/PB4RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);// 生成正弦波表generateSineTable();// 初始化TIM2(PWM)和TIM4(中断)TIM2_PWM_Init();TIM4_Init();// 配置NVICNVIC_InitTypeDef NVIC_InitStruct;NVIC_InitStruct.NVIC_IRQChannel = TIM4_IRQn;NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStruct);while(1) {// 主循环无需操作}
}

RC滤波电路 

PA2 → 10kΩ电阻 → 示波器

100nF电容

GND

http://www.dtcms.com/a/297067.html

相关文章:

  • 什么是JSON,如何与Java对象转化
  • QT跨平台应用程序开发框架(11)—— Qt网络编程
  • [NLP]一个完整的 UPF 文件示例
  • Vim 编辑器全模式操作指南
  • 纳米编辑器之Nano 编辑器退出**的详细操作指南
  • 【MacOS】发展历程
  • Linux 中 `chown`、`chgrp` 和 `chmod` 命令详解
  • openGauss数据库在CentOS 7 中的单机部署与配置
  • VMware虚拟出来的centos中设置静态ip
  • fish-speech 在50系列显卡使用 --compile加速兼容
  • Rust + Tauri 开发所需环境清单(以 Windows 为例)
  • 【unitrix】 6.16 非负整数类型( TUnsigned )特质(t_unsingned.rs)
  • [Rust 基础课程]猜数字游戏-获取用户输入并打印
  • 智能问答分类系统:基于SVM的用户意图识别
  • 弹性网:基于神经网络的多组分磁共振弹性成像波反演与不确定性量化|文献速递-医学影像算法文献分享
  • 奥比中光的dabai_dcw2相机彩色对齐方案
  • Android Camera setRepeatingRequest
  • 11. isaacsim4.2教程-Transform 树与Odometry
  • Java面试题(中等)
  • Cartographer安装测试与模块开发(三)--Cartographer在Gazebo仿真环境下的建图以及建图与定位阶段问题(实车也可参考)
  • 融合与智能:AI 浪潮驱动下数据库的多维度进化与产业格局重塑新范式
  • 深入解析Linux匿名管道机制与应用
  • 从数据孤岛到融合共生:KES V9 2025 构建 AI 时代数据基础设施
  • Lua 函数
  • JAVA_THIRTEEN_常用API
  • 星慈光编程虫2号小车讲解第三篇--附件概述
  • ai存在意义的对话
  • 从零开发Java坦克大战:架构设计与难点突破 (上)
  • 星慈光编程虫2号小车讲解第二篇--向左向右平移
  • 处理URL请求参数:精通`@PathVariable`、`@RequestParam`与`@MatrixVariable`