历史上的今天
返回首页

历史上的今天

今天是:2024年12月07日(星期六)

2020年12月07日 | STM32 —— 多路DAC(输出电压和正弦波)

2020-12-07 来源:elecfans

//========================================DAC=========================================

#define DA_OUT1_CHANNEL    DAC_Channel_1

#define DA_OUT1_GRP        GPIOA

#define DA_OUT1_INDEX      GPIO_Pin_4

#define DA_OUT1_HIGH()     GPIO_SetBits(DA_OUT1_GRP, DA_OUT1_INDEX)

#define DA_OUT1_CONFIG()   GPIOConfig(DA_OUT1_GRP, DA_OUT1_INDEX, GPIO_Mode_AIN)

 

#define DA_OUT2_CHANNEL    DAC_Channel_2

#define DA_OUT2_GRP        GPIOA

#define DA_OUT2_INDEX      GPIO_Pin_5

#define DA_OUT2_HIGH()     GPIO_SetBits(DA_OUT2_GRP, DA_OUT2_INDEX)

#define DA_OUT2_CONFIG()   GPIOConfig(DA_OUT2_GRP, DA_OUT2_INDEX, GPIO_Mode_AIN)


#ifndef _DAC_H_

#define _DAC_H_

 

void DAC1Init(void);

void DAC1OutVoltage(float data);

void DAC2Init(void);

 

#endif /* _DAC_H_ */


#include "dac.h"

//#include "target.h"

#include "type.h"

 

#define DAC_DHR12RD_ADDRESS      0x40007420

 

static const uint16_t sin[32] =

{

  2047, 2447, 2831, 3185, 3498, 3750, 3939, 4056, 4095, 4056,

  3939, 3750, 3495, 3185, 2831, 2447, 2047, 1647, 1263, 909,

  599, 344, 155, 38, 0, 38, 155, 344, 599, 909, 1263, 1647

 

};

static uint32_t dual_sin[32];

static uint8_t index = 0;

// PA4

static void dac1_clk_init(void)

{

  RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);

}

 

static void dac1_gpio_init(void)

{

  DA_OUT1_CONFIG();

  DA_OUT1_HIGH();

}

 

static void dac1_mode_init(void)

{

  DAC_InitTypeDef DAC_InitStructure;

 

  DAC_InitStructure.DAC_Trigger = DAC_Trigger_Software;

  DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None;

  DAC_InitStructure.DAC_LFSRUnmask_TriangleAmplitude = DAC_LFSRUnmask_Bits11_0;

  DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Enable;

  DAC_Init(DA_OUT1_CHANNEL, &DAC_InitStructure);

 

  DAC_Cmd(DA_OUT1_CHANNEL, ENABLE);

}

 

void DAC1Init(void)

{

  dac1_clk_init();

  dac1_gpio_init();

  dac1_mode_init();

}

 

// DAC1OutVoltage(1.5);// 1.5V out

void DAC1OutVoltage(float data)

{

  uint16_t value;

 

  value = (uint16_t)((data / 3.3) * 4096);

 

  DAC_SetChannel1Data(DAC_Align_12b_R, value);

  DAC_SoftwareTriggerCmd(DA_OUT1_CHANNEL, ENABLE);

}

 

static void dac2_clk_init(void)

{

  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE);

  RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8, ENABLE);

}

 

static void dac2_gpio_init(void)

{

  DA_OUT2_CONFIG();

  DA_OUT2_HIGH();

}

 

static void dac2_timer_init(void)

{

  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

 

  TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);

  TIM_TimeBaseStructure.TIM_Period = 0x19;

  TIM_TimeBaseStructure.TIM_Prescaler = 0x0;

  TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;

  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;

  TIM_TimeBaseInit(TIM8, &TIM_TimeBaseStructure);

 

  /* TIM8 TRGO selection */

  TIM_SelectOutputTrigger(TIM8, TIM_TRGOSource_Update);

}

 

static void dac2_mode_init(void)

{

  DAC_InitTypeDef DAC_InitStructure;

 

  /* DAC channel2 Configuration */

  DAC_InitStructure.DAC_Trigger = DAC_Trigger_T8_TRGO;

  DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None;

  DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Disable;

  DAC_Init(DA_OUT2_CHANNEL, &DAC_InitStructure);

 

  for(index = 0; index < 32; ++index)

  {

    dual_sin[index] = (sin[index] << 16) + sin[index];

  }

}

 

static void dac2_dma_init(void)

{

  DMA_InitTypeDef DMA_InitStructure;

 

  /* DMA2 channel4 configuration */

  DMA_DeInit(DMA2_Channel4);

  DMA_InitStructure.DMA_PeripheralBaseAddr = DAC_DHR12RD_ADDRESS;

  DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&dual_sin;

  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;

  DMA_InitStructure.DMA_BufferSize = 32;

  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;

  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;

  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;

  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;

  DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;

  DMA_InitStructure.DMA_Priority = DMA_Priority_High;

  DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;

  DMA_Init(DMA2_Channel4, &DMA_InitStructure);

}

 

static void dac2_enable(void)

{

  DMA_Cmd(DMA2_Channel4, ENABLE);

  DAC_Cmd(DA_OUT2_CHANNEL, ENABLE);

  DAC_DMACmd(DA_OUT2_CHANNEL, ENABLE);

  TIM_Cmd(TIM8, ENABLE);

}

 

void DAC2Init(void)

{

  dac2_clk_init();

  dac2_gpio_init();

  dac2_timer_init();

  dac2_mode_init();

  dac2_dma_init();

  dac2_enable();

}


推荐阅读

史海拾趣

Exel Microelectronics Inc公司的发展小趣事

Exel Microelectronics Inc公司成立于XXXX年,当时正值电子行业的蓬勃发展期。然而,初创时期的Exel面临着重重困难。公司创始人XXX先生凭借对半导体技术的深刻理解和对市场趋势的敏锐洞察,带领着一支小团队,开始了艰难的创业之路。资金紧张、技术瓶颈、市场竞争激烈,每一个问题都考验着团队的凝聚力和毅力。然而,正是这些困难锻炼了Exel人的意志,使公司逐渐在市场中站稳了脚跟。

DLP Design公司的发展小趣事

DLP精工科技公司,一直秉承“品质至上”的经营理念,在DLP技术产品的设计和制造过程中严格把控品质。公司拥有一支专业的研发团队和先进的生产设备,确保每一件产品都符合高标准的质量要求。通过不断的技术创新和产品升级,DLP精工科技在电子行业中树立了良好的品牌形象,赢得了消费者的信赖和认可。

Engelking Elektronik GmbH公司的发展小趣事

为了进一步提升技术实力和产品竞争力,Engelking Elektronik积极寻求与高校和研究机构的合作。通过与多家知名科技院校的合作,公司获得了多项技术专利和研发成果。其中,一项重要的技术突破是开发了一种新型的高效能电子元件,该元件在能效和可靠性方面均达到了行业领先水平。这一成果不仅为公司带来了可观的经济效益,也提升了公司在业界的地位。

Broadcom(博通)公司的发展小趣事

进入21世纪,随着网络泡沫的破灭,博通陷入了严重的财务困境。亏损累计高达65亿美元,股价大幅下跌,公司甚至不得不裁员以维持运营。然而,正是在这样的困境中,博通展现出了坚韧不拔的精神。通过优化产品结构、调整市场策略,博通逐渐走出了低谷,并在2003年推出了全球第一个802.11b单片机,重新赢得了市场的关注。

Bestar Electric公司的发展小趣事

随着电子行业的快速发展和市场竞争的加剧,Bestar Electric面临着诸多挑战。为了应对这些挑战,公司不断调整战略方向,加大研发投入,提升产品技术含量和附加值。同时,公司还注重人才培养和团队建设,吸引了一批优秀的研发、销售和管理人才,为公司的发展提供了有力保障。

Custom Mmic Design Services Inc公司的发展小趣事

CMDS深知技术创新是企业持续发展的关键。因此,公司不断加大研发投入,积极引进优秀人才和先进技术设备。通过持续的研发投入和人才培养,CMDS不断推出具有创新性和竞争力的新产品和解决方案。这些新产品不仅满足了客户不断变化的需求,也推动了整个行业的发展和进步。

问答坊 | AI 解惑

关于S3C2410裸机驱动LCD的问题

/************************************************************** 320×240 16Bpp TFT LCD功能模块初始化 **************************************************************/ void Lcd_Init(void) {         rLCDCON1=( ...…

查看全部问答>

别人的导航软件的手写输入在我定制的CE平台上识别不了,为什么?跟平台定制有关没?CE组件没加?

别人的导航软件的手写输入在我定制的CE平台上识别不了,为什么?跟平台定制有关没?CE组件没加?…

查看全部问答>

nand drive 问题

nand cach write/read 命令是自动连续读写nand 如果用这个命令后遇到坏blcok 怎么办?nand 自己会跳过吗? 谢谢…

查看全部问答>

请教KEIL中如何输入“%”,我输入就会出现错误

如题,这问题该怎么解决啊?哪位高手知道指点指点啊!谢谢了!…

查看全部问答>

wince5.0下直接读写内存

想在wince5.0下直接读写内存,往指定的空间读写数据,该怎么实现,忘达人们给点建议!!谢谢!!…

查看全部问答>

分析一个程序错误!

module delay_line(start,stop,up_out,upQ,down_out,downQ,clk,reset);input clk,start,stop,reset;reg [60:0]up_out,down_out,upQ,downQ;integer i,j,m,n;delay_unit du0(start,reset,up_out[0]);delay_unit du2(stop,reset,down_out[0]);always @ ...…

查看全部问答>

LM3S8962学习(四) -- 温度传感器

上次使用学习了一下Timer,每隔1秒钟中断一次,现在准备实现每隔1S钟读取一下内部的温度值,并在LCD上显示出来。   从手册288页上可以看出,LM3S8962的内部温度传感器有两个目的: 1.  防止温度过高或过低,影响系统芯片正常运行 ...…

查看全部问答>

大家来说说用DSP的时候你都遇到过什么样无法解决的问题

大家来说说用DSP的时候你都遇到过什么样无法解决的问题?…

查看全部问答>

超级给力DIY钢铁侠MK3方舟反应堆

从《钢铁侠1》到《复仇者联盟》再到《钢铁侠3》,托尼胸前的反应堆,也更新了好几代。高中刚毕业,放假在家,就有了想自己做一个反应堆的想法,然后就开始实践了。 ◆ 第一步:采购原材料(具体如下)      ● 网上定制的亚 ...…

查看全部问答>

∑ -μ01 HELP2416 入门分享

本帖最后由 DavidZH 于 2014-7-9 00:05 编辑 已经收到的HELP2416开发板,很精致。准备开始学习,按照以往学习其他MCU的经验,先是了解开发板的硬件,然后开始收集相关资料,如下图所示: 一、HELP2416的主芯片是S3C2416 芯片,其内核属于ARMv5 ...…

查看全部问答>