c语言编程三角波,STM32 三角波输出
原标题:STM32 三角波输出
还可以生成三角波,跟之前的生成正弦波和阶梯波不同,它不需要DMA帮助描点来画出波形,而是自己就可以生成三角波,因为三角波非常简单,只是线性的波形,所以对于DAC来说完全不是事。
下面就来讲讲怎么输出三角波,还是基于我自己的标准工程。
1、工程的修改
1)代码中需要用到定时器,所以添加stm32f10x_tim.c到STM32F10x_StdPeriod_Driver工作组中。
2)除了定时器,还需要用到DAC,故添加stm32f10x_dac.c到STM32F10x_StdPeriod_Driver工作组中。
3)打开stm32f10x_conf.h文件,把stm32f10x_tim.h、stm32f10x_dac.h、包含进来,也就是将原先屏蔽的包含这些文件的语句去掉屏蔽。
4)新建TriangleWave.c与TriangleWave.h这两个文件分别保存在BSP文件夹中的src与inc中,并将TriangleWave.c添加进工程的BSP中。
2、TriangleWave.c与TriangleWave.h程序的编写
显示初始化下引脚。两路三角波的都在DAC的CH1与CH2对应的两个引脚PA4与PA5输出,所以要配置下这两个引脚,代码如下:
/*************************************************************
Function : TriangleWave_GPIO_Init
Deion: 三角波对应的引脚初始化
Input : none
return : none
*************************************************************/
static void TriangleWave_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//初始化引脚时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5;//初始化DAC的CH1与CH2对应的引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;//模拟输入
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
接下去的是定时器的配置,代码如下:
/*************************************************************
Function : TriangleWave_TIM_Init
Deion: 三脚波需要的定时器初始化
Input : none
return : none
*************************************************************/
static void TriangleWave_TIM_Init(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);//初始化TIM2的时钟
TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);//初始化时基结构体
TIM_TimeBaseStructure.TIM_Period = 100;//周期值为100
TIM_TimeBaseStructure.TIM_Prescaler = 0;//不预分频
TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;//时钟不分频
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//增计数
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);//初始化TIM2
TIM_SelectOutputTrigger(TIM2, TIM_TRGOSource_Update);//设置触发源为更新触发,更新周期一次,则触发一次DAC转换
TIM_Cmd(TIM2, ENABLE);//打开定时器
}
这里设置定时器不分频,周期为100,增计数,在设置触发源为更新触发,这样的话,每次定时器更新,就触发一次DAC转换。
接下去是DAC的配置,先看看代码:
/*************************************************************
Function : TriangleWave_DAC_Init
Deion: 三角波需要的DAC初始化
Input : none
return : none
*************************************************************/
static void TriangleWave_DAC_Init(void)
{
DAC_InitTypeDef DAC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);//初始化DAC时钟
DAC_InitStructure.DAC_Trigger = DAC_Trigger_T2_TRGO;//DAC的触发源为TIM2
DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_Triangle;//输出三角波
DAC_InitStructure.DAC_LFSRUnmask_TriangleAmplitude = DAC_TriangleAmplitude_2047;//三角波的幅值对应的数字量为2047,即1.65V,频率为72M/100/2048/2=175Hz左右(与实际输出频率有一点出入)
DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Disable;//不适用DAC输出缓冲
DAC_Init(DAC_Channel_1, &DAC_InitStructure);//初始化DAC的CH1
DAC_InitStructure.DAC_LFSRUnmask_TriangleAmplitude = DAC_TriangleAmplitude_1023;//三角波的幅值对应的数字量为1023,即0.825V,频率为72M/100/1024/2=252Hz左右(与实价输出频率有一点出入)
DAC_Init(DAC_Channel_2, &DAC_InitStructure);//初始化DAC的CH2
DAC_Cmd(DAC_Channel_1, ENABLE);//打开DAC的CH1
DAC_Cmd(DAC_Channel_2, ENABLE);//打开DAC的CH2
DAC_SetDualChannelData(DAC_Align_12b_R, 0x00, 0x00);//设置DAC两个通道的数据右对齐,波谷对应的数字量风别为0,0
}
生成三角波的关键就在这个代码里了。首先是要设置DAC的触发源为TIM2,并设置DAC生成的波形为三角波。DAC完全可以自己生成三角波,而不用借助DMA。接下去设置DAC的CH1的幅值为2047,CH2的幅值为1023。要知道DAC是12位的,它的最高数字量为4095,所以通道1输出的三角波型对应的数字量会随着定时器更新从0~2747增加,在从2047~0减少;通道2输出的三脚波对应的数字量会随着定时器更新从0~1023增加,再从1023~0减少。最后在设置DAC的谷值为0。如果参考电压为3.3v,那么通道1的波形就会从0v~1.65v增加,再从1.65v~0v减少;通道1的波形就会从0~0.825v增加,在从0.825~0减少,这样的话就形成了三角波了。还要有一点要说的,上面代码中,DAC_SetDualChannelData(DAC_Align_12b_R, 0x00, 0x00);这句话很重要,它的意思是设置DAC的两个通道的数据右对齐,并且设置两路通道的波形的波谷为0。如果我们这样设置:DAC_SetDualChannelData(DAC_Align_12b_R, 0xFF, 0xFF),设置波谷的数字量为0xff,那么波形就会抬高0xff对应的电压0.2v左右。还要讲讲输出三角波的频率是怎么计算的,定时器的时钟为72M,它设置的周期为100,DAC的CH1的幅值设置成2047,DAC的CH2的幅值设置成1023,那么就可以计算出输出两路三角波的频率了:
CH1输出频率 = 72M / 100 / 2048 / 2 = 175.8Hz
CH2输出频率 = 72M /100 / 1024 / 2 = 351.6Hz
还要写一个总函数:TriangleWave_Init()来初始化下上面的代码:
/*************************************************************
Function : TriangleWave_Init
Deion: 三角波初始化
Input : none
return : none
*************************************************************/
void TriangleWave_Init(void)
{
TriangleWave_GPIO_Init();
TriangleWave_TIM_Init();
TriangleWave_DAC_Init();
}
下面在贴出TriangleWave.h文件的代码:
#ifndef __TRIANGLEWAVE_H__
#define __TRIABGLEWAVE_H__
#include "stm32f10x.h"
void TriangleWave_Init(void);
#endif
3、main函数的编写
main函数非常简单,只是调用一些初始化函数,代码如下:
/*************************************************************
Function : main
Deion: main入口
Input : none
return : none
*************************************************************/
int main(void)
{
BSP_Init();
TriangleWave_Init();
PRINTF("\nmain() is running!\r\n");
while(1)
{
1_Toggle();
Delay_ms(1000);
}
}
4、测试
用 的探头分别取测试PA4与PA5的引脚,然后查看它们的波形。
PA4,也就是DAC的CH1输出的波形的频率理论上应该为175.8Hz左右,实际波形如下:
PA5,也就是DAC的CH2输出的波形的频率理论上应该为351.6Hz左右,实际波形如下:
图形中可以看出来,实际输出的三角波频率与理论上计算得到的频率还是有点偏差的,我上面的代码设置频率只有几百Hz,如果增加频率到1KHz以上,就会发现实际输出的三角波频率与理论上计算出的频率偏差比较大的!
责任编辑:
c语言编程三角波,STM32 三角波输出相关推荐
- 斐波那契数列112358c语言编程,C程序显示斐波那契数列
C程序显示斐波那契数列 在此示例中,您将学习显示前n个数字的斐波那契数列(由用户输入). 要理解此示例,您应该了解以下C语言编程主题: 斐波那契数列是下一个项是前两个项之和的序列. 斐波那契数列的前两 ...
- 杨辉三角c语言编程视频,杨辉三角C语言编程
1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 杨辉三角在程序练习当中是比较常见的,根据上面的给出的数列可以看出一些规律来,每行的两边都是1,从第2列开始,每个数是上一行相邻的数之和,根据 ...
- C语言编程题——杨辉三角(两种方法实现)
杨辉三角--C语言实现 杨辉三角: 在屏幕上打印杨辉三角. 1 1 1 1 2 1 1 3 3 1 -- 根据上述例子可知: 1.每一行的第一个和第二个数为1: 2.其余的数为正上方和左边数字之和. ...
- 【C语言编程】求Fibonacci(斐波那契)数列前40个数
问题: 求Fibonacci(斐波那契)数列前40个数. 分析: 这个数列有如下特点:第1,2两个数为1,1.从第三个数开始,该数是其前面两个数之和.即该数列为1,1,2,3,5,8,13,- ,用数 ...
- c语言编程 打印田字格,python用函数输出田字格
用python输出田字格,有两种办法: 第一种使用print函数 代码如下print("+-----+-----+") print("+ + +") print ...
- 九九乘法表python语言编程软件_编写Python程序,输出如下的九九乘法表_学小易找答案...
[其它]写出下图的梯形图程序对应的语句表 (26.0分) [简答题]PLC一般的编程语言有几种?分别是什么? (5.0分) [其它]定义一个getMax函数,返回三个数(从键盘输入的整数)中的最大值. ...
- C语言编程题,给定一个日期,输出这个日期是该年的第几天
/**C语言编程题给定一个日期,输出这个日期是该年的第几天 */ int getIndexOfDay(int year, int month, int day) {int months[12] = { ...
- c语言编程三角波,DA转换 方波,锯齿波,三角波 C语言 编程
DA转换(函数波形发生器) 功能说明:1.该程序可产生三种不同的波形分别是(方波,锯齿波,三角波) 2.分别可以通过三个按键选择对应的波形. #include #include #include #d ...
- 基于stm32单片机的四种波形发生器正弦波、方波、三角波、锯齿波
基于stm32单片机的四种波形发生器(源程序+仿真+设计报告)全套资料 资料编号:010 具体功能: (1) 可以实现四种波形:正弦波.方波.三角波.锯齿波: (2) 通过按键进行选择,频率可以调整: ...
最新文章
- 由于市场判断失误 希捷降低收入预期
- 在 VS Code 里逛知乎、发文章?Zhihu on VSCode 来啦!重新定义内容创作!
- NuGet 发布类库,依赖项的问题
- 3 vue 线条箭头_教程|PPT绘制箭头最全攻略,收藏一下!
- 实现带header和footer功能的RecyclerView——完善篇
- 二叉树先序,中序,后序,层次遍历(数据结构)
- Java 8:再见手册SQL,您好!
- 大数据技术 学习之旅_如何开始您的数据科学之旅?
- MapReduce综合学习含Wordcount案例
- Mac上Java开发环境配置
- 不写一行代码就能玩转 Kaggle 竞赛?
- Java Programming Test Question 2
- MySQL查询优化:查询慢原因和解决技巧
- 着力财富管理市场产品全覆盖 基金公司争设销售子公司
- ISO 37301:2021《合规管理体系 要求及使用指南》国际标准解读及相关标准
- 前端页面劫持和反劫持
- 《东周列国志》第二十二回 公子友两定鲁君 齐皇子独对委蛇
- 商淘软件S2B2C供应链系统 支持多种电商模式
- RS232通信协议详解
- 计算机复制无法到qq上,为什么不能复制粘贴,解决电脑无法粘贴复制的方法
热门文章
- 大数据培训课程数据清洗案例实操-简单解析版
- UVM:解决phase的执行顺序
- 服务器更新git版本报错 git-compat-util.h:14:2:error “Required C99 support is in a test phase“
- python re import_完全搞懂Python 中的 import 与 from import
- centos7安装harbor详细教程
- c语言else if函数的使用方法,ELSE IF THEN 函数的用法
- 【CTF】Ubuntu 安装 GDB peda
- 关于递归算法设计的思考
- 求选修了学号为“95001”学生所学过的所有课程的学生学号和姓名
- POJ 1723 士兵排队 C语言实现