Subscribed unsubscribe Subscribe Subscribe

TI-Nspire & Lua / n ビット DAC で任意波形を描くための波形テーブルを生成する

Nspired Lua

f:id:ti-nspire:20170325091159p:plain:w300
.lua

function createWave(func)
   local POW = math.pow
   local FLOOR = math.floor
   local CEIL = math.ceil
   local MIN = math.min
   local MAX = math.max
   local unpack = table.unpack or unpack

   local numOfBits = 8 -- DAC の分解能 (ビット数)
   local Vdd = 3.3     -- リファレンス電圧(+)
   local Vss = 0       -- リファレンス電圧(-)
   local voltDiff = Vdd - Vss
   local numOfData = 1024 -- 1 周期ぶんのデータの数
   local function seq(from, to, step)
            local list = {}
            for i = from, to, (step or 1) do
               list[#list+1] = i
            end
            return list
         end
   local function round(x, digits)
            local exp = POW(10, (digits or 0))
            if x >= 0 then
               return FLOOR(x * exp + 0.5) / exp
            else
               return CEIL(x * exp - 0.5) / exp
            end
         end
   local function map(var, inMin, inMax, outMin, outMax)
            return (var - inMin) * (outMax - outMin) / (inMax - inMin) + outMin
         end
   return function(Tstart, Tstop, Vmin, Vmax)
             local listA = {}
             local STEP = (Tstop - Tstart) / numOfData
             for i = Tstart, Tstop, STEP do -- 始点から次の始点まで計算しているので 1 回余計に計算しているがここでは抛っておく。
                listA[#listA+1] = func(i)
             end
             
             -- 計算結果の最小値 ~ 最大値を指定の範囲に map する。
             local rawMin = MIN(unpack(listA))
             local rawMax = MAX(unpack(listA))
             local dataUpperLimit = POW(2, numOfBits) - 1
             local dataMin = (Vmin/(voltDiff)) * (dataUpperLimit)
             local dataMax = (Vmax/(voltDiff)) * (dataUpperLimit)
             local listB = {}
             for i = 1, numOfData do
                listB[#listB+1] = round(map(listA[i], rawMin, rawMax, dataMin, dataMax))
             end

             -- 結果は全部 Nspire へ返す。
             var.store("xvalue", seq(0, numOfData - 1))
             var.store("yvalue", listB)
          end
end

-- 確かめてみる
-- この函数を波形テーブルに格納する。
function pulse(x)
   local SIN = math.sin
   local sute = 0
   for i = 1, 3, 2 do
      sute = sute + SIN(i * x) / i
   end
   return sute
end
createWave(pulse)(0, 2 * math.pi, 0.5, 3) -- 0 ~ 2 pi を 1 周期として、上の函数を最小値 0.5 V、最大値 3 V で波形テーブル化する。
Remove all ads

PIC16F1789 & MPUトレーナー 11 / DAC で任意の波形を生成する

PIC16F1789 & MPUトレーナー

参考: 定番!ARMキット&PIC用Cプログラムでいきなりマイコン制御[DVD-ROM付き] (マイコン活用シリーズ), p131-134


テーブルに格納した 8 ビットデータを順番に読み取って任意波形を生成する。リファレンス電圧には電源電圧を使う。
f:id:ti-nspire:20170324151311p:plain:h300 f:id:ti-nspire:20170324150236p:plain:h300
f:id:ti-nspire:20170324145929j:plain:h300



main.c

#include "mcc_generated_files/mcc.h"
//#include <math.h>
#define TBL_CNT		16

// 1 周期ぶんの 8 ビットデータ
uint8_t Tbl[] = {10,10,10,10,200,200,100,200,100,250,250,250,250,50,50,100};

void main(void) {
	SYSTEM_Initialize();
	while (1) {
		for(int i = 0; i < TBL_CNT; i++) {
			DAC1_SetOutput(Tbl[i]);
		}
	}
}
Remove all ads