三角波
本次实验采用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!!!