在软件上为模拟输入/输出生成方波

问题描述 投票:0回答:1

我有一个设备,它有数字i / o,模拟i / o。我发送到设备下面的命令进行通信。设备有gpio模块。我的设备文档是here

写入数字输入:qazxsw poi 从数字输出中读取:qazxsw poi 从数字输出读取:gpio set/clear x (x:密码)

如何创建正弦波/方波并计算幅度?要创建方波:

  • 打开设备
  • 睡觉
  • 写入器件低电平模式(t0)
  • 睡觉
  • 写入设备高模式
  • 睡觉
  • 写入设备低电平模式(t1)

期间=(t1 - t0)

这是方波吗?

c driver analog-digital-converter digital-analog-converter
1个回答
1
投票

看来你的例子确实是方波

如果gpio read x将输出引脚设置为低电平并将adc read x设置为高电平或反转,那么周期是睡眠的总和+设置GPIO状态的时间。不知道为什么你有时间在GPIO设置线内而不是睡觉...(可能是平台依赖的东西?)

要去正弦波

使用DAC或PWM + RC滤波器和一些预先计算的幅度表,其中索引周期性地增加。

write to device low mode(t0)

编码:write to device low mode(t1)为零,BYTE sintab[32]={ 128,...,255,...,128,...,0,....,127 }; 128255+1;现在只需添加一些索引:

0

并偶尔(在一些计时器上)增加它并将输出设置为新值:

-1

那个和int ix=0' 只会导致索引从最后一次开始循环(sintab必须是2的大小幂)。周期是定时器频率/ sintab大小

[笔记]

你可以修改它以达到你的目的,例如使ix=(ix+1)&31; 成为一个二维数组,其中第一个索引表示振幅,第二个是31,就像现在一样。在较旧的平台(MCU)上,您可以将PWM序列直接编码到sintab[][]端,等等......

您可以像这样预先计算ix值:

sintab

或者如果您的平台支持足够快的sintab,您可以直接使用上面的行而不使用实际的数组...

EDIT1

对于sintab[ix]=128.0+127.0*sin(float(2.0*M_PI*ix)/32.0); 你可以使用sin状态。如果您需要模拟输出并且:

  1. 你有DAC(数模转换器) 然后像sinwave一样将实际幅度发送到它,这将为您在输出引脚上创建模拟电压。
  2. 您没有任何备用DAC使用PWM脉冲宽度调制 这是一个老式的技巧,以避免DAC的需要,仍然有数字引脚的模拟输出。它的工作原理如下: 输出值是每个时间块的累积能量/电压,因此您可以生成方波信号 比率1:1表示半个周期为H,其余为L 比率2:1表示期间的2/3为H,其余为L. 输出H越多,输出值越大。这仍然是数字输出,但如果你连接任何非线性设备,如电容器或线圈,那么0/1将导致H电压降低到某个水平,取决于方波比。最常见的是RC滤波器(R为串联,C与地并联)。如果你想驱动一些线圈(电机),那么你不需要过滤器。这种使用通常会产生在机械附近经常听到的高音调声音(PWM频率)...... PWM频率必须足够高(比sinwave频率高很多倍)

一些带有幅度和频率设置的PWM代码:

dac write sintab[ix];
© www.soinside.com 2019 - 2024. All rights reserved.