-->

signed

QiShunwang

“诚信为本、客户至上”

STM32学习笔记之三角波的实现(寄存器版本)

2021/6/3 18:32:58   来源:

三角波

本次实验采用STM32F1,请注意辨别!!!

前言

咳咳,三角波对于我这个初学者来说,太折磨了!!!主要原因还是我比较菜!第一天,在学习PWM后决定使用PWM生成三角波,结果出现各种各样奇葩的波形,比如梯子状,陡坡状·····哎,不说了,都是泪,在查看了中文参考手册时,我才发现可以通过DAC来进行生成三角波·····

除了参考中文手册,以及在网上查找资料(结果都是库函数版的),于是通过搜集各个式样的生成步骤,终于得到了这样的波:
在这里插入图片描述
还是很像三角波吧。(才怪!)

我就陷入了无休止的调改和尝试中。

正文

ok,以上前言都是废话,不过是在发牢骚而已。下面才是知识点!!!

STM32 DAC简介

STM32的DAC模块(数字/模拟转换模块)是12位数字输入,电压输出型的DAC。DAC可以配置为8位或12位模式,也可以与DMA控制器配合使用。DAC工作在12位模式时,数据可以设置成左对齐或右对齐。DAC模块有2个输出通道,每个通道都有单独的转换器。在双DAC模式下,2个通道可以独立地进行转换,也可以同时进行转换并同步地更新2个通道的输出。
STM32的DAC模块主要特点有:
① 2个DAC转换器:每个转换器对应1个输出通道
② 8位或者12位单调输出
③ 12位模式下数据左对齐或者右对齐
④ 同步更新功能
⑤ 噪声波形生成
⑥ 三角波形生成
⑦ 双DAC通道同时或者分别转换
⑧ 每个通道都有DMA功能

当然这些概念在《STM32不完全手册(寄存器)》都有,这里引用一下!!

重点是设置
我们此次实验使用通道一,TIM2定时器,PA4

关于使能时钟在此不做赘述,可以直接查看代码。
在这里插入图片描述
1.使能触发功能 TENx = 1;
在这里插入图片描述
2.DAC1输出缓存不使能 BOFF1=1
在这里插入图片描述
3.DAC 触发TIMx TRGO事件,(要TEN1=1才行)
在这里插入图片描述
4.生成三角波

在这里插入图片描述
5.设置振幅4095 (0~3.3v)可以设置其他。
在这里插入图片描述
6.DAC1 DMA不使能
在这里插入图片描述
7.使能DAC通道一
在这里插入图片描述
8.选择对齐方式
在这里插入图片描述

ok,以上配置均可以在《中文手册》中找到,,

重点代码如下:
time.h

#ifndef __TIMER_H
#define __TIMER_H
#include "sys.h"



void TIM2_Int_Init(u16 arr,u16 psc);
void Dac1_Init(void);
#endif


time.c

#include "timer.h"
//#include "led.h"
#include "sys.h"
//DAC通道1输出初始化
void Dac1_Init(void)
{   	
	RCC->APB1ENR|=1<<29;   	//使能DAC时钟	   
	RCC->APB2RSTR|=1<<2;  	//使能PORTA时钟	  
	GPIOA->CRL&=0XFFF0FFFF;  
	GPIOA->CRL|=0X00000000; //PA4 模拟输入 
	
	
	DAC->CR|=1<<2;	//使能触发功能 TEN1=1
	DAC->CR|=1<<1;	//DAC1输出缓存不使能 BOFF1=1
	DAC->CR|=4<<3;	//DAC TIM2 TRGO,不过要TEN1=1才行
	DAC->CR|=2<<6;	//生成三角波
	DAC->CR|=12<<8;  //设置振幅4095
	DAC->CR|=0<<12;	//DAC1 DMA不使能    
	DAC->CR|=1<<0;	//使能DAC1
	
	DAC->DHR12R1 = 0;
}

		
//TIM2初始化
void TIM2_Int_Init(u16 arr,u16 psc)
{
	RCC->APB1ENR|=1<<0;	//TIM2时钟使能    
 	TIM2->ARR=arr;  	//设定计数器自动重装值 
	TIM2->PSC=psc;  	//预分频器	  
	TIM2->CR2|=2<<4;    //选择更新事件作为触发输出
	TIM2->CR1|=1<<0;    //使能定时器2
}

main.c

#include "sys.h"
#include "usart.h"		
#include "delay.h"	
#include "led.h"   
#include "timer.h" 


int main(void)
{			
	TIM2_Int_Init(49,71);
	Dac1_Init();
	while(1)
	{
	
	}	
}

TIM2_Int_Init(49,71);这里的值,如果有心的话可以多放几组查看有什么不同!

ps:当连上示波器时需要等待十几秒,,,

结果如下:
在这里插入图片描述
在这里插入图片描述

ok!!!