我有一个设备,它有数字i / o,模拟i / o。我发送到设备下面的命令进行通信。设备有gpio模块。我的设备文档是here
写入数字输入:qazxsw poi
从数字输出中读取:qazxsw poi
从数字输出读取:gpio set/clear x
(x:密码)
如何创建正弦波/方波并计算幅度?要创建方波:
期间=(t1 - t0)
这是方波吗?
看来你的例子确实是方波
如果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 };
为128
,255
为+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
状态。如果您需要模拟输出并且:
sinwave
一样将实际幅度发送到它,这将为您在输出引脚上创建模拟电压。0/1
将导致H电压降低到某个水平,取决于方波比。最常见的是RC滤波器(R为串联,C与地并联)。如果你想驱动一些线圈(电机),那么你不需要过滤器。这种使用通常会产生在机械附近经常听到的高音调声音(PWM频率)......
PWM频率必须足够高(比sinwave频率高很多倍)一些带有幅度和频率设置的PWM代码:
dac write sintab[ix];