この左図の様にT1とT2の時間を変化させます。
analogWrite( 3 , 255/2 )を実行した波形です。
analogWrite( 3 , 77 )を実行した波形です。
ArduinoはUSBで接続しています。
この波形を見て下さい、
MCP4922はSPI接続なので左図の様に複数個接続が| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| A/B | BUF | GA | SHDN | D11 | D10 | D9 | D8 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
MCP4922のOUTA出力を取合えずLEDに
接続しています。
※ 最新のIDEでは"SCK"名がマクロ定義されている様なので"DA_SCK"に変更しました。 *2)
---------------------------------------------------------------------
#define DA_SCK 13 // クロック信号出力ピン
#define DA_SDI 11 // データ信号出力ピン
#define DA_CS 10 // 選択動作出力ピン
#define DA_LDAC 9 // ラッチ動作出力ピン
// DACに出力を行う処理の関数
void DACout(int dataPin,int clockPin,int destination,int value)
{
int i ;
// コマンドデータの出力
digitalWrite(dataPin,destination) ;// 出力するピン(OUTA/OUTB)を選択する
digitalWrite(clockPin,HIGH) ;
digitalWrite(clockPin,LOW) ;
digitalWrite(dataPin,LOW) ; // VREFバッファは使用しない
digitalWrite(clockPin,HIGH) ;
digitalWrite(clockPin,LOW) ;
digitalWrite(dataPin,HIGH) ; // 出力ゲインは1倍とする
digitalWrite(clockPin,HIGH) ;
digitalWrite(clockPin,LOW) ;
digitalWrite(dataPin,HIGH) ; // アナログ出力は有効とする
digitalWrite(clockPin,HIGH) ;
digitalWrite(clockPin,LOW) ;
// DACデータビット出力
for (i=11 ; i>=0 ; i--) {
if (((value >> i) & 0x1) == 1) digitalWrite(dataPin,HIGH) ;
else digitalWrite(dataPin,LOW) ;
digitalWrite(clockPin,HIGH) ;
digitalWrite(clockPin,LOW) ;
}
}
void setup() {
// 制御するピンは全て出力に設定する
pinMode(DA_SCK, OUTPUT) ;
pinMode(DA_SDI, OUTPUT) ;
pinMode(DA_CS, OUTPUT) ;
pinMode(DA_LDAC,OUTPUT) ;
// 出力ピンの初期化
digitalWrite(DA_SCK,LOW) ;
}
void loop() {
digitalWrite(DA_LDAC,HIGH) ;
digitalWrite(DA_CS,LOW) ;
DACout(DA_SDI,DA_SCK,0,4095/2) ; // VREF/2の電圧をOUTAから出す
digitalWrite(DA_CS,HIGH) ;
digitalWrite(DA_LDAC,LOW) ; // ラッチ信号を出す(ここで実際に出力する様に指示)
while(1) ; // 処理中断
}
---------------------------------------------------------------------
SPI通信は利用せずに、ソフトウエアでDACへデータを送信するスケッチのサンプルです。
---------------------------------------------------------------------
#include "pins_arduino.h"
#include <SPI.h>
#define LDAC 9 // ラッチ動作出力ピン
void setup() {
// 制御するピンは全て出力に設定する
pinMode(LDAC,OUTPUT) ;
// SPIの初期化処理を行う
SPI.begin() ; // SPIを行う為の初期化
SPI.setBitOrder(MSBFIRST) ; // ビットオーダー
SPI.setClockDivider(SPI_CLOCK_DIV8) ;// クロック(CLK)をシステムクロックの1/8で使用(16MHz/8)
SPI.setDataMode(SPI_MODE0) ; // クロック極性0(LOW) クロック位相0
}
void loop() {
int i ;
i = 4095/2 ;
digitalWrite(LDAC,HIGH) ;
digitalWrite(SS,LOW) ;
SPI.transfer((i >> 8) | 0x30) ; // Highバイト(0x30=OUTA/BUFなし/1x/シャットダウンなし)
SPI.transfer(i & 0xff) ; // Lowバイトの出力
digitalWrite(SS,HIGH) ;
digitalWrite(LDAC,LOW) ; // ラッチ信号を出す
}
---------------------------------------------------------------------
こんどはSPI通信を利用したサンプルスケッチです。
---------------------------------------------------------------------
void loop() {
int i ;
for (i=0 ; i < 4096 ; i=i+4) {
digitalWrite(LDAC,HIGH) ;
digitalWrite(SS,LOW) ;
SPI.transfer((i >> 8)|0x30) ;
SPI.transfer(i & 0xff) ;
digitalWrite(SS,HIGH) ;
digitalWrite(LDAC,LOW) ;
}
}
---------------------------------------------------------------------
と、この様にのこぎり波形になっちゃいま〜す。
変更(*2) 2015/04/23
追記(*1) 2014/12/25
【きむ茶工房ガレージハウス】
Copyright (C) 2006-2020 Shigehiro Kimura All Rights Reserved.