第七章模拟外设课后习题2、3、6、9题,
2 简述 ADC 的一般工作流程
ADC 将模拟信号转化为数字信号的过程可分为四步
- 采样:对模拟信号进行周期性抽取样值的过程
- 保持:对模拟信号进行 A/D 转换需要一定的转换时间,下一个采样脉冲到来之前,暂时保持所取得的样值脉冲幅度,以便进行转换
- 量化:将信号的连续取值近似为有限多个离散值
- 编码:将量化后的离散量用相应的二进制码表示
3
简述 ADC 的类型及其特点
模数转换器的种类很多,按工作原理的不同,可分成直接比较型和间接比较型和 Σ − Δ Σ-Δ Σ−Δ 型
- 直接比较:
- 直接比较型 ADC 将输入模拟信号直接与标准的参考电压比较 从而得到数字量
- 有并行比较型 ADC
- 现今速度最快的模数转换器
- 电路规模极大(于 n 位的输出需要 2 n 2^n 2n 个电阻和 2 n − 1 2^{n−1} 2n−1 个比较器)
- 价格高
- 只适用于要求高速、低分辨率的场合
- 逐次逼近型 ADC
- 比较高速
- 功耗相当低
- 在低分辩率(<12 位)时价格便宜
- 高精度(>12 位)时价格很高
- 间接比较:
- 输入模拟量不是直接与参考电压比较,将二者变为中间的某种物理量再比较
- 将比较所得的结果进行数字编码
- 积分型 ADC
- 分辨率高
- 功耗低
- 成本低
- 转换速率低
- 主要应用于低速、精密测量等领域,如数字电压表
-
Σ
−
Δ
Σ-Δ
Σ−Δ 型
- 分辨率高
- 成本低
- 在既有模拟又有数字的混合信号处理场合优势明显
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 变化趋势改为递增
}