一、引言

在前面的两篇文章里,讲解了频率计和占空比可调的方波发生器的设计思路。本篇文章讲解正弦波发生器的设计思路。

频率计:https://blog.csdn.net/zzlwl/article/details/115352504

方波发生器:https://blog.csdn.net/zzlwl/article/details/114882800

在设计之初,考虑到stm32f4 dma 的优越性能,确定了使用dma进行正弦波发生器的设计目标。

搜索资料阶段,参考了正点原子的例程,但没有找到持续正弦波发生的例程。放弃。

找到了网上的一篇介绍dma正弦波的文章,但重现时发现其定时器的重载数值存在奇怪的特定值才工作的悬疑现象。放弃。

在这段时间中一直研究CubeMX,确定了使用CubeMX进行正弦波发生器的思路。

最终实现:1hz-31.25khz(正弦表32点到256点之间动态跳变)正弦发生器,在此范围内最大频率间隔约等于当前设定值2%,最小为0(具体取决于因式分解,未经理论证明)

二、主要数据

(1)缓冲还是不缓冲?

查阅 stm32F40x-2015-3-ID022152v5资料发现如下:

显然,不缓冲比缓冲更优越。

(2)速度问题和频率

同上资料

显然,最高更新速率为1us,6us肯定可以更新完。如果32点,则最高频率1000/32=31.25K

计划让定时器计数频率为80M,分频数为7(8分频)每次加一位0.1us。由于最高更新速度为1us,故定时器最低数值为9(1us)

三、CubeMX设置

启用usart1、dma、dac1 tim6,在cubeMx中建立dma、dac1、tim6之间连接。在时钟数中更改分频数,让主时钟工作频率为160Mhz

(CubeMX图形化使用请参考前两篇文章)

keil RTE HAL库 STM32CubeMX 串口收发 https://blog.csdn.net/zzlwl/article/details/115431728

Keil RTE 闪灯程序 https://blog.csdn.net/zzlwl/article/details/115394066

四、代码核心思路

(1)在主程序中调用中断接收函数

HAL_UART_Receive_IT(&huart1,&(rxData.buff[0]),1); 启动中断接收

在回调函数void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)中进行格式检查,如果收到回车换行则认为命令输入完成,否则继续中断接收。

(2)生成256点正弦表,并启动定时器,启动dma,开始预设频率输出

HAL_TIM_Base_Start(&htim6);
       HAL_DAC_Start_DMA(&hdac, DAC_CHANNEL_1, (uint32_t *)sinTbl, 256,DAC_ALIGN_12B_R);

从上文可以计算出,预设频率值为10,000,000/256/10=3.906K

(10,000,000为1秒中0.1us的个数,256表示正弦表有256个点,10表示当前定时器的自动重载数值。定时器每0.1us加1)

(3)主循环任务处理

主循环中完成数据输入,范围检查,因式分解,重设定时器和dma的工作。

(3.1)计算最优的定时值和正弦点数的组合

如果数据输入有效,则根据频率计算周期值(单位0.1us),如果周期数值 >256*10,则采用256点,否则进行一个台阶内最佳因式分解工作。

一个台阶的含义,如周期数 <256*10,但 >128*10  则在保证点数 >128的情况下循环判断,找到最优的点数 和定时器定时值的组合。所谓最优,是指上述两整型数相乘后和设定周期值误差最小。

(3.2)重新生成正弦表,重设定时器和dma

__HAL_TIM_SET_AUTORELOAD(&htim6,arr-1);//根据实际的定时器时间重设定时器
           HAL_DAC_Stop_DMA(&hdac, DAC_CHANNEL_1); //如果不先关闭dma则下面重设点数不起作用。   
            HAL_DAC_Start_DMA(&hdac, DAC_CHANNEL_1, (uint32_t *)sinTbl, npoint,DAC_ALIGN_12B_R);//dma开始

重设定时器的宏来自文件#include "stm32f4xx_hal_tim.h",如果提示编译错误,可添加此文件。

五、调试后

这个项目除上文提及代码外,正弦表生成、串口接收回调函数、最优化定时和正弦点数代码为自己编写,其他代码均为系统自动生成。感觉使用CubeMX思路较为清晰,另外个别宏直接用do while包装实现,感觉兼顾了概念和速度。但中文资料较少,对程序员的C水平、外语水平要求较高。

stm32f4 dma da正弦波发生器 keil5 hal库 CubeMX相关推荐

  1. STM32 HAL库 CUBEMX配置 ADC采集

    文章目录 STM32 HAL库 CUBEMX配置 ADC采集 软硬件型号 1.单通道不定时任意时刻采集信号 CUBEMX配置 代码添加 2.单通道ADC采集+DMA传输 CUBEMX添加配置 代码添加 ...

  2. STM32 HAL库 CubeMX教程(五)串口通信基础

    STM32 HAL库 CubeMX教程(五)串口通信基础 串口通信简介 CubeMX配置 初始化程序分析 程序编写 参考文献 STM32 HAL库 CubeMX系列教程 目录 串口通信简介 UART: ...

  3. stm32直流电机PID控制hal库(Cubemx)

    stm32直流电机PID控制hal库(Cubemx),一步步手把手教你怎么配置cubemx怎么写代码. 未对pid就行深入解析,不过相信您通过配置和写代码以后大概可以知道pid的主要作用. 文章目录 ...

  4. STM32F407霸天虎HAL库CubeMX学习笔记——DS18B20

    STM32F407霸天虎HAL库CubeMX学习笔记--DS18B20 一.软件准备 二.硬件准备 三.CubeMX配置 四.Keil printf重写 tim.c DS18B20.h DS18B20 ...

  5. STM32 HAL库 CUBEMX FPU 和 DSP库

    转自:https://blog.csdn.net/yuleitao/article/details/105621492?ivk_sa=1024320u FPU 简介 FPU 即浮点运算单元(Float ...

  6. 编码电机测速(stm32f1/HAL库/CubeMX/编码器模式/平衡小车/直流减速电机/超详细)

    系列文章目录(STM32常用外设/HAL库版) 一.HC-SR04超声波模块的使用 二.OLED的HAL库代码介绍及使用 三.直流减速电机的测速以及电机驱动的使用(本篇) 文章目录 系列文章目录(ST ...

  7. 蓝牙小车(基于stm32f103c8t6/HAL库/CubeMX/超详细,包含代码讲解和原理图)

    系列文章目录链接 一.小车1.0--基本蓝牙小车(仅蓝牙遥控小车运动方向,本篇) 二.小车2.0--蓝牙小车PLUS(可以蓝牙控制方向+蓝牙直接调节车速) 三.小车3.0--避障小车(超声波+舵机云台 ...

  8. STM32——超声波测距模块(HAL库CubeMx)

    超声波测距 1. 超声波测距模块原理 2. CubeMx配置 3. 代码的编写 3.1 定时器计时的计算 3.2 接口函数 1. 超声波测距模块原理 (2021/11/28 16:25编辑) 超声波测 ...

  9. STM32 HAL库 CubeMx 按键中断控制LED

    依旧是使用Clion和CubeMx开发 实现功能 以中断的方式,通过按键控制 led灯的亮灭 按一下,灯亮.再按一下,灯灭. 一 新建工程 查看原理图 按键 PA15 LED灯 PA8 打开CubeM ...

  10. 【STM32F4系列】【HAL库】【自制库】WS2812(软件部分)(PWM+DMA)

    文章目录 相关链接 协议 外设设置 硬件PWM 分析 HAL设置 DMA 分析 HAL设置 方案设计 代码实现 解码函数 开始发送和复位 发送函数 波形 成品 相关链接 硬件介绍(PCB设计方案) 模 ...

最新文章

  1. stdio.h iostream.h iostream 三者
  2. hdu-4825(01字典树)
  3. javasript --- 一个日期规范(x秒前,x分前...)
  4. java虚拟机 山寨机_十年前的山寨机居然有系统?没错,还是纯国产的
  5. superagent返回结果乱码
  6. mimo-ofdm无线通信技术及matlab实现_智芯文库 | FPGA无线通信课程连载——扰码的原理及实现...
  7. WEB环境下打印报表的CRYSTAL的解决方案
  8. [转] 暴风影音被挂马 已有28000网民遭侵袭
  9. 图解TCPIP---第一章
  10. excel表格坐标导入cad怎样操作?
  11. C语言删除注册表某个键值,怎么批量快速删除注册表中指定的某个键值
  12. js验证银行卡身份证手机号中文数字金额等
  13. php 设置post大小_php – 设置$_POST变量
  14. *** WARNING : deprecated key derivation used. Using -iter or -pbkdf2 would be better.
  15. 智能工厂设备无人值守系统方案
  16. 高并发高可用之ElasticSearch
  17. php 之session 进行时
  18. win10锁屏聚集图片不更新,右上角没有出现喜欢的按钮,怎么办?
  19. IaaS PaaS SaaS云服务三种应用模式
  20. 计算并输出正整数n的各位数字之积

热门文章

  1. 360大牛解读PHP面试-高并发解决方案类考察点
  2. 对机器学习实战第二章内容的思考
  3. 安卓电子书格式_求把 EPUB 转换成 MOBI 的电子书格式转换工具
  4. 性能测试-性能狗(Perfdog)测试与数据分析
  5. Java算法面试题(009) 毒酒问题
  6. 电力行业巡检对讲通信系统
  7. webservice接口开发学习笔记(一)
  8. 按3倍中误差去除粗差(C++)
  9. 数据库查询之内连接,左连接,右连接
  10. 【从零开始学架构-李运华】09|架构设计原则案例