1、嵌入式系统设计(基于STM32F429)第 13 章课后题参考答案1. 常用的 DAC 电路结构有哪些? 答:权电阻网络 DAC 、R2R 倒 T 形电阻网络 DAC、电流型网络 DAC2. 分辨率为 12 位,参考电压为 3.3V 的 DAC,想要输出 1.2V 的电压,请问输出这一电压对应的数字信号是多少?答:(1.2/3.3)*4095 = 14893. STM32F429 微控制器的DAC 有哪些触发方式(转换启动方式)? 答:(1) 、软件触发:通过写 DAC 的数据保持寄存器 触发 DAC 转换(2) 、硬件信号触发: 通过定时器 TRGO 事件 或 外部中断线 9 触发。4. 请
2、问寄存器 DHR 和 DOR 之间有什么关系? 答:DHR:数据保持寄存器。可读写。DOR:数据输出寄存器。只读。 程序一般操作的是 DHR 寄存器。5. DAC 单通道的数据格式有哪些? 答:(1) 对于 DAC 单通道 x,有三种可能的方式。8 位右对齐:软件必须将数据加载到 DAC_DHR8Rx7:0位(存储到 DHRx11:4位)。12 位左对齐:软件必须将数据加载到 DAC_DHR12Lx15:4位(存储到 DHRx11:0位)。12 位右对齐:软件必须将数据加载到 DAC_DHR12Rx11:0位(存储到 DHRx11:0位)。(2) 对于 DAC 双通道,有以下可能的方式。8 位
3、右对齐:将DAC 通道 1 的数据加载到 DAC_DHR8RD7:0位(存储到DHR111:4位),将 DAC 通道 2 的数据加载到 DAC_DHR8RD15:8位(存储到 DHR211:4位)。12 位左对齐:将 DAC 通道 1 的数据加载到 DAC_DHR12RD15:4位(存储到 DHR111:0位),将 DAC 通道 2 的数据加载到 DAC_DHR12RD31:20位(存储到 DHR211:0位)。12 位右对齐:将 DAC 通道 1 的数据加载到 DAC_DHR12RD11:0位(存储到 DHR111:0位),将 DAC 通道 2 的数据加载到 DAC_DHR12RD27:16
4、位(存储到 DHR211:0位)。6. 软件如何启动一次 DAC 转换? 答:通过写 DAC 的 DHR 寄存器即可实现。有以下函数:void DAC_SetChannel1Data(uint32_t DAC_Align, uint16_t Data) void DAC_SetChannel2Data(uint32_t DAC_Align, uint16_t Data)void DAC_SetDualChannelData(uint32_t DAC_Align, uint16_t Data2, uint16_t Data1)7. 作为 DAC 的模拟信号输出通道的 GPIO 引脚需要怎么初始化
5、?以 DAC1 为例。答:GPIO_InitTypeDef GPIO_InitStructure;/*-第 1 步*/* 使 能 GPIOA 时 钟 */ RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);/* 使 能 DAC 时 钟 */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);/*-第 2 步*/* DAC 的 GPIO 配 置 , 模 拟 */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; GPIO_InitStructure.GPI
6、O_Mode = GPIO_Mode_AIN; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOA, &GPIO_InitStructure);8. 编程序配置 STM32F429 微控制器的 DAC1 产生一个频率为 2kHz 的正弦波。答:1) 结合定时器中断实现。在每次定时器中断中写 DAC 数据保持寄存器启动 DAC 转换。教材中例 13.5,修改 TIM_Config(void)。TIM_TimeBaseStructure.TIM_Period = 2250-1;/ 采 样 频 率 = 40KHz TIM_
7、TimeBaseStructure.TIM_Prescaler = 0x0;/预分频,不分频 90M / (0+1) = 90M TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;/时钟分频系数TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);/向上计数模式2) 结合定时器和 DMA 实现。使用定时器溢出事件 作为 DAC 的转换触发信号。使用 DMA 将波形数据缓冲区中的数据源转移到 DA
8、C 数据保持寄存器中。#definePi3.1415926#definef1000/正弦波频率 2KHz#definefs20000/采样频率40KHz/* 波形数据*/uint16_t Sine_Table20;(1) DAC 配置函数此函数执行之后,定时器每次溢出都会触发一次 DAC 自动转换,DMA 控制转换的数据来源。void DAC_Mode_Init(void)uint32_t Idx = 0;/* 填充正弦波形数据,双通道右对齐*/ for (i = 0; i 20; i+)Sine_Table i = (uint16_t )(float)4095*(1+sin(2*i*Pi*
9、f /fs)/2);DAC_Config();/DAC 初始化DAC_TIM_Config();/定时器 初始化DAC_DMA_Config();/DMA 初始化(2) DAC 初始化函数static void DAC_Config(void)GPIO_InitTypeDef GPIO_InitStructure; DAC_InitTypeDef DAC_InitStructure;/* 使 能 GPIOA 时 钟 */ RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);/* 使能 DAC 时钟 */RCC_APB1PeriphClock
10、Cmd(RCC_APB1Periph_DAC, ENABLE);/* DAC 的 GPIO 配置,模拟输入 */* DAC 的 GPIO 配 置 , 模 拟 */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOA, &GPIO_InitStructure);/* 配置 DAC 通道 1 */DAC_InitStructure.DAC_Trig
11、ger=DAC_TRIGGER;/ 使 用 TIM2 的 溢 出 触 发 DAC DAC_InitStructure.DAC_LFSRUnmask_TriangleAmplitude=DAC_LFSRUnmask_Bit0; /屏蔽幅值设置DAC_InitStructure.DAC_WaveGeneration=DAC_WaveGeneration_None; / 不使用波形发生器DAC_InitStructure.DAC_OutputBuffer=DAC_OutputBuffer_Enable; /启用输出缓冲DAC_Init(DAC_CH1_CHANNEL, &DAC_InitStruct
12、ure);/* 使 能 通 道 1 由 PA4 输 出 */ DAC_Cmd(DAC_CH1_CHANNEL, ENABLE);(3) 定时器初始化static void DAC_TIM_Config(void)TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure;/* 使 能 TIM2 时 钟 ,TIM2CLK 为 180M */ RCC_APB1PeriphClockCmd(DAC_TIM_CLK, ENABLE);/* TIM2 基本定时器配置 */TIM_TimeBaseStructure.TIM_Period = 2250-1;/ 采 样 频 率
13、= 40KHz TIM_TimeBaseStructure.TIM_Prescaler = 0x0;/ 预 分 频 , 不 分 频 90M / (0+1) = 90M TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;/时钟分频系数TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(DAC_TIM, &TIM_TimeBaseStructure);/* 配置 TIM2 触发源 */TIM_SelectOutputTrigger(DAC_TIM, TIM
14、_TRGOSource_Update);/* 使 能 TIM2 */ TIM_Cmd(DAC_TIM, ENABLE);/向上计数模式(4) DMA 初始化static void DAC_DMA_Config(void)DMA_InitTypeDef DMA_InitStructure;/* DAC1 使 用 DMA1 通 道 7 数 据 流 5 时 钟 */ RCC_AHB1PeriphClockCmd(DAC_DMA_CLK, ENABLE);/* 配 置 DMA2 */ DMA_InitStructure.DMA_Channel = DAC_CHANNEL;DMA_InitStructu
15、re.DMA_PeripheralBaseAddr = (uint32_t)(DAC_BASE+0x20);/外设数据地址DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t) Sine_Table ; / 内 存 数 据 地 址DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;/数据传输方向内存至外设DMA_InitStructure.DMA_BufferSize = 20;/ 缓 存 大 小 为 20 DMA_InitStructure.DMA_PeripheralInc = DMA_
16、PeripheralInc_Disable; /外设数据地址固定DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;/内存数据地址自增DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;/半字为单位DMA_InitStructure.DMA_MemoryDataSize = DMA_PeripheralDataSize_HalfWord;/ 半字为单位DMA_InitStructure.DMA_Mode = DMA_Mode_Circula
17、r; DMA_InitStructure.DMA_Priority = DMA_Priority_High;/循环模式/高 DMA 通道优先级DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable; DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single; DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;DMA_Init(DAC_DMA_STREAM, &DMA_InitStructure);/* Enable DMA_Stream */ DMA_Cmd(DAC_DMA_STREAM, ENABLE);/* 使 能 DAC 的 DMA 请 求 */ DAC_DMACmd(DAC_CH1_CHANNEL, ENABLE);
侵权处理QQ:3464097650--上传资料QQ:3464097650
【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。