第七章《嵌入式系统原理与实践》--沈建华 王慈 清华大学出版社 课后部分习题个人答案

第七章模拟外设课后习题2、3、6、9题,

2 简述 ADC 的一般工作流程

ADC 将模拟信号转化为数字信号的过程可分为四步

  1. 采样:对模拟信号进行周期性抽取样值的过程
  2. 保持:对模拟信号进行 A/D 转换需要一定的转换时间,下一个采样脉冲到来之前,暂时保持所取得的样值脉冲幅度,以便进行转换
  3. 量化:将信号的连续取值近似为有限多个离散值
  4. 编码:将量化后的离散量用相应的二进制码表示

3

简述 ADC 的类型及其特点

模数转换器的种类很多,按工作原理的不同,可分成直接比较型和间接比较型和 Σ − Δ Σ-Δ ΣΔ

  1. 直接比较:
    • 直接比较型 ADC 将输入模拟信号直接与标准的参考电压比较 从而得到数字量
    • 有并行比较型 ADC
      • 现今速度最快的模数转换器
      • 电路规模极大(于 n 位的输出需要 2 n 2^n 2n 个电阻和 2 n − 1 2^{n−1} 2n1 个比较器)
      • 价格高
      • 只适用于要求高速、低分辨率的场合
    • 逐次逼近型 ADC
      • 比较高速
      • 功耗相当低
      • 在低分辩率(<12 位)时价格便宜
      • 高精度(>12 位)时价格很高
  2. 间接比较:
    • 输入模拟量不是直接与参考电压比较,将二者变为中间的某种物理量再比较
    • 将比较所得的结果进行数字编码
    • 积分型 ADC
      • 分辨率高
      • 功耗低
      • 成本低
      • 转换速率低
      • 主要应用于低速、精密测量等领域,如数字电压表
  3. Σ − Δ Σ-Δ ΣΔ
    • 分辨率高
    • 成本低
    • 在既有模拟又有数字的混合信号处理场合优势明显

6

一个 n 位的逐次比较式 ADC,理论上需要多少个时钟完成一次模数转换?

n 位逐次逼近型 ADC 完成一次转换需要 n+2 个时钟周期。

9

假设一个 12 位的 DAC,满量程输出为 0~5V。要用数字频率合成方法输出一个幅度为 1~4V、周期为 100ms 的三角波。请写出设计思路及伪代码

#include <ti/devices/msp432p4xx/driverlib/driverlib.h>
#include <stdint.h>
#include <stdbool.h>

// main函数内容都是平时实验部分的main函数内容,可以直接照搬
int main(void)
{ 
    MAP_WDT_A_holdTimer();// 停用开门狗 
    MAP_FPU_enableModule();//启用 FPU 加快 DCO 频率计算,注:DCO 是内部数字控制振 荡器,默认是 3M 频率
    MAP_CS_setDCOFrequency(1000000);// 设置 DCO 频率为指定频率,此处 DCO=1M
    MAP_CS_initClockSignal(CS_MCLK, CS_DCOCLK_SELECT, CS_CLOCK_DIVIDER_1);// 设置 MCLK(主时钟频率),MCLK=DCO 频率/时钟分频系数,此处 MCLK=DCO=1M

    MAP_GPIO_setAsDACPin(GPIO_PORT_PX, GPIO_PINY);// 配置 PX.Y 为 DAC 输出引脚,此函数代表 DAC 配置函数非实际函数
    
    // 配置 Timer32 的第一个计数器为 32 位模式,周期模式,定时器频率=MCLK/定时器分频    系数 此处第一个计数器频率=MCLK=1M 
    MAP_Timer32_initModule(TIMER32_0_BASE, TIMER32_PRESCALER_1,TIMER32_32BIT,TIMER32_PERIODIC_MODE);
    
    // 使能 Timer32 第一个计数器中断开关
    MAP_Interrupt_enableInterrupt(INT_T32_INT1); 
    MAP_Timer32_enableInterrupt(TIMER32_0_BASE);
    MAP_Interrupt_enableMaster();
    MAP_Timer32_setCount(TIMER32_0_BASE,20); 
    MAP_Timer32_startTimer(TIMER32_0_BASE, false);

    while (1); 
}

//只需要修改中断函数部分的内容即可
void T32_INT1_IRQHandler(void)
{
    static int current = LOW;
    static int sign = 1;
    MAP_Timer32_clearInterruptFlag(TIMER32_0_BASE); //清除 Timer32 第一个计数器中断标志*
    MAP_GPIO_DAC(GPIO_PORT_PX,GPIO_PINY,current); //在 PX.Y 输出 DAC,此函数代表输出 DAC 非实际函数
    current += sign;
    if (current == 819) sign = -1; // 三角波低电压 1v 对应 DAC 数值 819 DAC 变化趋势改为递减
    else if(current == 3276) sign = 1; //三角波高电压 4v 对应 DAC 数值 3276 DAC 变化趋势改为递增
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值