stm32实现波形发生器

#include “dac.h”
//DAC 通道 1 输出初始化
void Dac1_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
DAC_InitTypeDef DAC_InitType;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE ); //①使能 PA 时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE ); //②使能DAC时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; // 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模拟输入
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure); //①初始化 GPIOA
GPIO_SetBits(GPIOA,GPIO_Pin_4) ; //PA.4 输出高
DAC_InitType.DAC_Trigger=DAC_Trigger_None; //不使用触发功能
DAC_InitType.DAC_WaveGeneration=DAC_WaveGeneration_None;//不使用波形发生
DAC_InitType.DAC_LFSRUnmask_TriangleAmplitude=DAC_LFSRUnmask_Bit0;
DAC_InitType.DAC_OutputBuffer=DAC_OutputBuffer_Disable ; //DAC1 输出缓存关
DAC_Init(DAC_Channel_1,&DAC_InitType); //③初始化 DAC 通道 1
DAC_Cmd(DAC_Channel_1, ENABLE); //④使能 DAC1
DAC_SetChannel1Data(DAC_Align_12b_R, 0); //⑤12 位右对齐,设置 DAC 初始值
}
//设置通道 1 输出电压
//vol:0~3300,代表 0~3.3V
void Dac1_Set_Vol(u16 vol)
{
float temp=vol;
temp/=1000;
temp=temp4096/3.3;
DAC_SetChannel1Data(DAC_Align_12b_R,temp);// 12 位右对齐设置 DAC 值
}
此部分代码就 2 个函数,Dac1_Init 函数用于初始化 DAC 通道 1。步骤①~⑤基本上是按我
们上面的步骤来初始化的,经过这个初始化之后,我们就可以正常使用 DAC 通道 1 了。第二
个函数 Dac1_Set_Vol,用于设置 DAC 通道 1 的输出电压,通过 USMART 调用该函数,就可以
随意设置 DAC 通道 1 的输出电压了。
接下来我们看看 main 函数如下:
int main(void)
{
u16 adcx;
float temp;
u8 t=0;
u16 dacval=0;
u8 key;
delay_init(); //延时函数初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置 NVIC 中断分组 2
uart_init(115200); //串口初始化波特率为 115200
KEY_Init(); //初始化按键程序
LED_Init(); //LED 端口初始化
LCD_Init(); //LCD 初始化
usmart_dev.init(72); //初始化 USMART
Adc_Init(); //ADC 初始化
Dac1_Init(); //DAC 初始化
POINT_COLOR=RED;//设置字体为红色
LCD_ShowString(30,50,200,16,16,“WarShip STM32”);
LCD_ShowString(30,70,200,16,16,“DAC TEST”);
LCD_ShowString(30,90,200,16,16,“ATOM@ALIENTEK”);
LCD_ShowString(30,110,200,16,16,“2015/1/15”);
LCD_ShowString(30,130,200,16,16,“WK_UP:+ KEY1:-”);
//显示提示信息
POINT_COLOR=BLUE;//设置字体为蓝色
LCD_ShowString(60,150,200,16,16,“DAC VAL:”);
LCD_ShowString(60,170,200,16,16,“DAC VOL:0.000V”);
LCD_ShowString(60,190,200,16,16,“ADC VOL:0.000V”);
DAC_SetChannel1Data(DAC_Align_12b_R, 0); //初始值为 0
while(1)
{
t++;
key=KEY_Scan(0);
if(key== WKUP_PRES)
{
if(dacval<4000)dacval+=200;
DAC_SetChannel1Data(DAC_Align_12b_R, dacval); //设置 DAC 值
}else if(key== KEY1_PRES)
{
if(dacval>200)dacval-=200;
else dacval=0;
DAC_SetChannel1Data(DAC_Align_12b_R, dacval); //设置 DAC 值
}
if(t10||keyKEY1_PRES||key==WKUP_PRES)
{
adcx=DAC_GetDataOutputValue(DAC_Channel_1); //读取前面设置 DAC 的值
LCD_ShowxNum(124,150,adcx,4,16,0); //显示 DAC 寄存器值
temp=(float)adcx
(3.3/4096); //得到 DAC 电压值
adcx=temp;
LCD_ShowxNum(124,170,temp,1,16,0); //显示电压值整数部分
temp-=adcx;
temp*=1000;
LCD_ShowxNum(140,170,temp,3,16,0X80); //显示电压值的小数部分
adcx=Get_Adc_Average(ADC_Channel_1,10); //得到 ADC 转换值
temp=(float)adcx*(3.3/4096); //得到 ADC 电压值
adcx=temp;
LCD_ShowxNum(124,190,temp,1,16,0); //显示电压值整数部分
temp-=adcx;
temp*=1000;
LCD_ShowxNum(140,190,temp,3,16,0X80); //显示电压值的小数部分
LED0=!LED0;
t=0;
}
delay_ms(10);
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值