今週は徹夜あり、終電連打などでヘロヘロです。
ふと窓の外を見たときの夕日がとてもきれいでした。
iPhone 002

あぁきれいだなぁ。
土曜日も一日仕事してましたが、どうしても我慢できずに日が暮れる前にノイズ対処しました。

ハード面ではツェナーダイオードの付け替え
ソフト面ではパルスの感知をFallingEdgeに振っただけです。
 
iPhone 002
メーターをタンクバッグにガムテで結んで走ってきました。

今のところバッチリ動いています。
ソフトで15,000回転に制限してますが、SDRでこの回転数までは行かないでしょうから、これで米屋太号で使えるんじゃないでしょうか。

前回の回路では6.1Vのツェナーでしたが、針が跳ねる、つまりノイズが入ってる理由はなんとなくこれだろうなって思ってました。
 無題
CDIの波形は減衰していく正弦波なので、数回マイナス電圧がきます。
この波が1回目はツェナーを乗り越えて、以降は乗り越えない様にしないといけません。
そこでツェナーの降伏する電圧を少し上げてみたという事です。
でも、、、そもそもNSの回路はなぜこの回路で大丈夫なのでしょうか。
NS製の回路をもう一度見てみます。
無題
よく見るとC1コンデンサが小さい波は吸ってしまっている様子でもあります。
ですので、今回作った回路もC1の0.0047uFを入れるのも良い方法なのかも知れません。

今回は手持ちに13.1Vのツェナーという、あんまり使い道のないものがありましたので、こちらに付け替えです。
回路はZDを6.1から13.1に変えただけです。
秋月電子に売っている12~15V位のツェナーダイオードでええかなと思います。

iPhone 001

少し寄り道。
米屋太号はコンデンサ倍電圧回路で昇圧された600Vが入っています。
ノーマルのCDIと比較して高電圧になってますので、この回路に入る電圧も倍になる寸法です。

R1は18Kですから、600Vかかった場合単純に最大33mA流れる計算になります。
単純に計算するとW=VIの式から600(V)x0.033(A)=20Wで定格1/4W程度の抵抗は即燃えてしまいます。
ただ、これは延々と流し続けていた場合の話でして、CDIが生み出す電圧は0.5ms程度で減衰する正弦波ですから消費電力はこれよりも相当小さくなります。
ここでざっくりと計算してみますと、8,000rpmまでキッチリ600Vコンデンサに充電されると1/4Wの抵抗ですとほぼ定格に達する様な気がします。最低でも1/2Wの抵抗を使う必要はありますね。
また、カーボン抵抗の定格電圧は500〜700V程度のものが多いらしいのでこれも心配です。
まぁ倍加回路はいろいろな部分に負担を掛けすぎるので、レーサー以外では使わない方が無難かなと最近は思っています。

実際のここまでの内容を動画にまとめときました。


3MAのタコメータはわりと正確なんですが、やっぱり動作が遅いので吹けあがりに数千回転程度遅延が発生してます。
最初心配していた「針がピクピクしている感じ」も走っている間はそれほど気になりませんので、へんな平準化もしなくて正解でした。

回転数表示はかなり正確なんじゃないかなって思います。
ステッピングモーターは今回4msec間隔でドライブしています。
4msecといえば、15,000rpmのパルスの間隔です。
タコメータのスケールにもよりますけど、3XVタコメーターパネルのスケールですと、大体この回転数で25rpm/1msecの変化はついていくことになりますので、SDRならばええ感じで追従可能なんじゃないかなって思います。

今回の部品代は500円位ですかね。
電子部品をイチから買っても1000円位ないんじゃないかなと思います。

ノイズ除去はツェナーだけしかやってませんので、まぁ正しい対処だったと思います。
明日幕張でアルモクさんに渡しとこうかなぁ〜と思ってますがいらっしゃいますかね〜。
FIX版のソースです。
→FIXしてませんでした
  [コードを表示する]
/* -----------------------------------------------------------------------------------------
              PIC12F1822 Pinout
              +--------+
          Vdd |1      8| GND
 Captre>- RA5 |2      7| RA0 -> OUT_B
  LED  <- RA4 |3      6| RA1 -> OUT_A
  MCLR -> RA3 |4      5| RA2 -> Suspend
              +--------+
----------------------------------------------------------------------------------------- */

#include <xc.h> // include standard header file

// set Config bits
#pragma config FOSC=INTOSC	// Oscillator Selection bits
#pragma config PLLEN=OFF	// PLL Enable bit
#pragma config WDTE=OFF		// Watch dog timer enable bit
#pragma config MCLRE=OFF	// MCLEAR enable bit
#pragma config CLKOUTEN=OFF	// Clock Out Enable bit
#pragma config IESO=OFF		// Internal External Switchover bit
#pragma config FCMEN=OFF	// Fail-Safe Clock Monitor Enable bit
#pragma config CP=OFF		// Code Protection bit
#pragma config CPD=OFF		// Data Code Protection bit
#pragma config BOREN=ON		// Brown-out Reset Enable bits
#pragma config WRT=OFF		// Flash Memory Self-Write Protection bits
#pragma config STVREN=ON	// Stack Overflow/Underflow Reset Enable bit
#pragma config BORV=LO		// Brown-out Reset Voltage Selection bit
#pragma config LVP=OFF		// Low-Voltage Programming Enable bit

// Definitions
#define _XTAL_FREQ  8000000        // this is used by the __delay_ms(xx) and __delay_us(xx) functions

#define OUTA			LATA1
#define OUTB			LATA0
#define SMD_STANDBY	LATA2
#define SM_SENS		RA3
#define LED			LATA4
#define INPULSE		RA5

#define HH()	{OUTA=1;OUTB=1;}
#define LH()	{OUTA=0;OUTB=1;}
#define LL()	{OUTA=0;OUTB=0;}
#define HL()	{OUTA=1;OUTB=0;}9

#define TURN_L 1
#define TURN_R 0
#define SM_PULSE_INTERVAL	4
#define RPM1000			5
#define RPMMAX			280
#define SMD_STANDBY_ON		0
#define SMD_STANDBY_OFF		1

// Global
unsigned int gSMTarget = 0;
unsigned int gPos = 0;

/* -----------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------- */
void interrupt Interrupt()
{
	if(CCP1IF)
	{
		static unsigned int preSMTarget = 0;
		unsigned int ccpr1;

		SMD_STANDBY = SMD_STANDBY_OFF;

		// Reset Timer1
		TMR1H=0;
		TMR1L=0;
		
		// for YAMAHA TZR250(3XV) tacho meter scale.
		ccpr1 = ((CCPR1H * 0x100)|CCPR1L) + 1;
		gSMTarget = (unsigned int)(830000UL/ccpr1);
		
		if(gSMTarget>=RPM1000) gSMTarget -= RPM1000;
		if(gSMTarget>RPMMAX) gSMTarget = RPMMAX;
		CCP1IF = 0;
	}
	
	// Timer1: Timeout means engine stop
	if(TMR1IF) {
		gSMTarget = 0;
		SMD_STANDBY = SMD_STANDBY_ON;

		TMR1IF = 0;
		LED = 0;
	}
}

/* -----------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------- */
void rotate(int dir)
{
	static signed char phase = 0;
	
	if( dir ) {
		phase++;
		phase %= 4;
	}	
	else
	{
		phase--;
		if( phase < 0 ) phase = 3;
	}	

	switch( phase ) {
		case 0: HH(); break;
		case 1: LH(); break;
		case 2: LL(); break;
		case 3: HL(); break;
		default: break;
	}	
	__delay_ms(SM_PULSE_INTERVAL);
}

/* -----------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------- */
void main ( ) 
{
	int ii, jj;

	OPTION_REG =	0b00000000;	// 
	WPUA =		0b00000000;	// pull-up pins
	
	// set up oscillator control register
	OSCCON=		0b01110010;	// 8Mhz

	// Set up I/O pins
	// PORT A Assignments
	APFCON=		0b00000001;	// CCP1 function is on RA5
	TRISA=		0b00101000;	// 
	PORTA=		0b00000000;	// Reset port
	ANSELA=		0b00000000;	// Disable analog input
	LED = 1;

	// Timer1 Clock Source Select bits
	T1CONbits.TMR1CS=0;		// 00 = Timer1 clock source is instruction clock (FOSC/4)
	T1CONbits.T1CKPS=0x01;		// Timer1 Input Clock Prescale Select bits 1:2 Prescale value
	T1CONbits.T1OSCEN=0;		// Dedicated Timer1 oscillator circuit disabled
	T1CONbits.nT1SYNC=1;		// 1 = Do not synchronize external clock input
	T1CONbits.TMR1ON=0;		// Timer1 On bit

	// Set up Capture input
	CCP1CON=	0b00000100;	// Capture mode: every falling edge
	// CCP1CON=		0b00000101;	// Capture mode: every rizing edge

	// Reset CCP1/Timer interrupt flag
	CCP1IF=0;
	TMR1IF=0;

	// Initialize Stepping motor postion
	__delay_ms(300);
	SMD_STANDBY = SMD_STANDBY_OFF;

	while( 0 != SM_SENS ) {rotate( TURN_L );}
	while( 0 == SM_SENS ) {rotate( TURN_R );}
	gPos == 0;

	// startup demo
	for( ii=0; ii < RPM1000; ii++ ) {
			rotate( TURN_R );
	}		

	for( jj = 0; jj < 14; jj++ ) {
		for( ii = 0; ii < 14; ii++ ) {
			rotate( TURN_R );
		}
		__delay_ms(300);
	}
	for( ii = 0; ii < 14*14; ii++ ) {
		rotate( TURN_L );
	}
	__delay_ms(1000);
	
	

	// Enable Interrupt
	PEIE=1;			// Enable peripheral interrupt
	GIE=1;			// enable global interrupt
	CCP1IE=1;			// enable the CCP1 interrupt   
	TMR1IE=1;			// enable Timer1 intterupt on
	TMR1ON=1;			// Timer1 On

	while(1) {
		if( gSMTarget > gPos ) {
			rotate( TURN_R );
			gPos++;
			continue;
		} else if( gSMTarget < gPos ) {
			rotate( TURN_L );
			gPos--;
			continue;
		} else {
		}
	}
}
/*---------------------------------------------------------------------------------
Copyright 2012-2014 Rilassaru All rights reserved.

Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:

 * Redistributions of source code must retain the above copyright notice, this list
   of conditions and the following disclaimer.
 * Redistributions in binary form must reproduce the above copyright notice, this
   list of conditions and the following disclaimer in the documentation and/or
   other materials provided with the distribution.
 * Neither the name of the IshiSoft nor the names of its contributors may be used
   to endorse or promote products derived from this software without specific prior
   written permission. 

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.

*/