TZKさんによると和歌山のSDRは今週末も岡山国際で練習との事。
この間送った定格600VのRCDIはYPVSが動作しなかったって事で、先ほどまたRCDIを桑原エンジニアリングさんのところに送付。

うーん、、、そんな事あるんかいな、、、、。
あそこはPICマイコン→IC→電線というとってもシンプルな構造なので、あんまりトチる事って考えられないんだけど、なんかポカしたんやろか。

圧縮が高いエンジンなので昇圧回路は今後も使いたいとの事でしたが、定格外のCDIで利用するのはちょっと気にはなります。


シマユウ選手のSDRが参戦する「モトレヴォwithモトルネ Rd.3」は8月14日。お盆前。
東西ガチンコSDRのレースが見れる貴重なイベント。
関西、中部の方々は二台のSDR、応援よろしくお願いします。

自分的には2次試験直前なのでやばいです。
1次試験通れば、、、の話ですが。

閑話休題。
ソレノイドコントローラの話。
IMG_0107


勉強せな、勉強せな、、、と思いながら、

あぁなんで俺はオシロを握ってるんや!
IMG_0111




あぁなんで俺はガンマのソレノイドをカポカポ言わせてるんや!
IMG_0113

そしてソレノイドにホースを突っ込んで吸ったりしてるオッサン。
IMG_0115

アホですな。



動画みてもなんかをイジイジしているだけでサッパリ意味わかりません。
これはパルスエミュレータから疑似入力をして、回転数を変更、3千、6千、9千回転での動きを確認してます。
カチカチ音がしているのがソレノイドの動作音です。

動画では10Hz位で動かしてみたけれども、やっぱりちょっぴり荒いので、あとから20Hzに変更。
それでも吸ってみるとソコソコ脈動を感じますね〜。
ガンマのエアソレノイドへの配管は必要以上に長いんだけど、このソレノイドのオンオフの脈動を吸収する為に長いんだと思います。


しばらく放置して熱を持つかどうか等を確認。
まぁ、、、熱もって壊れたところで、このソレノイド自体はミクニがスズキやヤマハの原チャリにもつけてた位出回っているので入手性が高く、たいして問題はありません。



今回のテスト用ソフト、動作は簡単。
ソレノイドのDuty比を簡単に調整できる様に3つのダイヤルがついており、それぞれ3000rpm、6000rpm、9000rpmでのDuty比を設定する。
それ以外の回転数は3つの値から補完する。

例えばこんな感じ。
sol
 
FETは手持ちの2N7000使ってますけど、本来ならば5Vで0.5A程度駆動できる奴があればそれで良いかなと思います。

  • そんなに速度が必要な訳でもありませんので、AD変換のAcquisiton時間は100usとってます。
    可変抵抗を10K程度にすれば10usもあればお釣りがくると思ってます。
  • float変数使ってるのでメモリが逼迫してます。
    PIC12F1822のまま何か機能を追加するにはちょいと考える必要があります。
  • Dutyサイクルはメインループの__delay_ms(5)で変更できます。
    あんまり早くするとソレノイドの動作が追いつかない可能性があります。
  • メモリ不足につき、優雅さがあんまりありません(笑)
後は実車で試すだけですね。
パルス入力回路は、CDIのマイナス電圧を使って感知するヤマハの電タコと同じ方式で組んでみてます。
まぁなんでもいいんですけど、誰かにポイって渡すにはこれが都合がよく。
一般的なCDI方式ならAC/DC関係なく問題無く動作しますし。


それよりも大きな問題が。

今日のTM32SSのセッティングですが、
MJ:260 → 250
MAJ:0.9
PJ:27.5
PAJ:1.1
NJ:O-8
JN:6GH8-55-3
PWJ1:100
PWJ2:0.6
MASJ:全閉じ
PASJ:全閉じ

となってます。
MJをちょっと絞って結局以前の一番良かったセッティングにほぼ収束してしまいました。
違いはO-9とO-8の筒の違い位。
これで1速パワーバンドの引っかかりも殆どなくなり、(ちょいと濃い目で)調子よく走ることが出来ています。

ま、つまりソレノイド不要な状態になっちゃってるんですね・・・。
恐らくMAJが0.9と大きめなので、これを0.6に戻して、中間域をソレノイド制御すると、とても幸せになれそうだとは思うのですが・・・。

パトラッシュ僕はもう疲れたよ
pato

テストもあるし・・・。



ソースコードはこちら。
何時ものBSDライセンス、つまりご自由にドゾーというやつです。
こんな子供の夏休みの様なものでライセンスとかアレなんですが、自由に改変、配布を保証する為の著作者としての権利を行使しないといけないのでライセンスが必要なんです。メンドクサー。
 
[コードを表示する]
/* ------------------------------------------------------------------
                 PIC12F1822 Pinout
                 +--------+
             Vdd |1      8| GND
    Captre>- RA5 |2      7| RA0 <- AN0 RPM3
Solenoid  <- RA4 |3      6| RA1 <- AN1 RPM6
     MCLR -> RA3 |4      5| RA2 <- AN2 RPM9
                 +--------+
-------------------------------------------------------------------*/

#include  // 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 OUTSOL      LATA4
#define INPULSE     RA5

unsigned int gRPM;

/* ------------------------------------------------------------------
PIC Interrupt
-------------------------------------------------------------------*/
void interrupt Interrupt()
{
  // Interrupt from Input capture
  if(CCP1IF) {
    unsigned int ccpr1;

    // Reset Timer1
    TMR1H=0;
    TMR1L=0;
    
    // RPM
    ccpr1 = ((CCPR1H * 0x100)|CCPR1L) + 1;
    gRPM = (unsigned int)(600000UL/ccpr1);
    CCP1IF = 0;
  }

  // Timer1: Timeout means engine stop
  if(TMR1IF) {
    gRPM = 0;
    TMR1IF = 0;
  }
}

/* ------------------------------------------------------------------
Analog converter
-------------------------------------------------------------------*/
unsigned int adconv100(unsigned int ch)
{
  unsigned int temp;
  ADCON0bits.CHS = ch;
  __delay_us(100);       // Acquisiton delay
  
  GO_nDONE = 1 ;         // Start conversion
  while(GO_nDONE) ;      // Is conversion done?
  temp = ADRESH ;        // Store value by 10bits
  temp = ( temp << 8 ) | ADRESL ;  // 0-1023

  temp /= 10;
  if(temp > 100) temp = 100;

  return 100 - temp ;
}

/* ------------------------------------------------------------------
main
-------------------------------------------------------------------*/
void main ( ) 
{
  OPTION_REG =  0b00000000;  // 
  WPUA =        0b00000000;  // diable week pull-up pins
  
  // set up oscillator control register
  OSCCON=    0b01110000;  // 8Mhz
  
  // Set up I/O pins
  // PORT A Assignments
  APFCON=  0b00000001;  // CCP1 function is on RA5
  TRISA=  0b00101111;  // Set I/O mode
  PORTA=  0b00000000;  // Reset port
  ANSELA=  0b00000111;  // Disable analog input
  ADCON1=  0b10010000;  // Right justify, FOSC, Vdd and Vss Vref
  ADCON0=  0b00000001;  // Select channel to AN0
  __delay_us(100);       // Acquisiton delay
  
  // 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

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

  // 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
  
  float duty30, duty60, duty90;
  unsigned int duty;
  int ii;
  
  // Indication
  for(ii=0; ii<5; ii++) {
    OUTSOL = 1;  __delay_ms(200);
    OUTSOL = 0;  __delay_ms(200);
  }
  
  while(1) {
    duty30 = adconv100(0);
    duty60 = adconv100(1);
    duty90 = adconv100(2);
    
    // Leveling duty value
    if     (20 <  gRPM && gRPM < 30)  {duty= (unsigned int)(0     +((duty30-   0.0)/10)*(gRPM-20));}
    else if(30 == gRPM)          {duty= (unsigned int)duty30;}
    else if(30 <  gRPM && gRPM < 60)  {duty= (unsigned int)(duty30+((duty60-duty30)/30)*(gRPM-30));}
    else if(60 == gRPM)          {duty= (unsigned int)duty60;}
    else if(60 <  gRPM && gRPM < 90)  {duty= (unsigned int)(duty60+((duty90-duty60)/30)*(gRPM-60));}
    else if(90 == gRPM)          {duty= (unsigned int)duty90;}
    else if(90 <  gRPM && gRPM < 100)  {duty= (unsigned int)(duty90+((   0.0-duty90)/10)*(gRPM-90));}
    else duty = 0;

    // Duty max = 90%
    if( duty > 90 ) duty = 90;
    
    // Solenoid duty control
    OUTSOL = 0;
    for(ii=0; ii<10; ii++) {
      if(ii < duty/10) {
        OUTSOL = 1;
      } else {
        OUTSOL = 0;
      }
      __delay_ms(5);
    }
  }
}
/*---------------------------------------------------------------------------------
Copyright 2012-2016 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 Rilassaru 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.

*/