2015年3月14日土曜日

PSoC 4 Pioneer Kit ADCとDebouncerをPollingで使う

Pollingで使うExampleは見つからなかったが
普通にAPIを呼び出すことでPollingはできた

TopDesign


<main.c>

 #include <project.h>  
 #include <stdio.h>  
 #define CH0_N        (0x00u)  
 #define CH1_N        (0x01u)  
 #define CH2_N        (0x02u)  
 #define ADC_LOW_LIMIT  ((int16)0x000)  
 #define ADC_HIGH_LIMIT ((int16)0x7FF)  
 #define ADC_LIMIT(x) \  
   ((x)<ADC_LOW_LIMIT?ADC_LOW_LIMIT:((x)>=ADC_HIGH_LIMIT?ADC_HIGH_LIMIT:(x)))  
 volatile int16 adcResult[ADC_TOTAL_CHANNELS_NUM];  
 volatile uint32 sw1Count = 0;  
 volatile uint32 sw2Count = 0;  
 int main()  
 {  
   char uartLine[250];  
   uint8 sw1, sw2;  
   uint8 prevSw1 = 0u;  
   uint8 prevSw2 = 0u;  
   /* Initialize the UART */  
   UART_Start();  
   UART_PutCRLF();  
   UART_PutCRLF();  
   UART_PutString("Starting Controller measurement...");  
   UART_PutCRLF();  
   /* Init and start sequencing SAR ADC */  
   ADC_Start();  
   CyGlobalIntEnable;  
   for(;;)  
   {  
     // Polling ADC  
     ADC_StartConvert();  
     while (ADC_IsEndConversion(ADC_RETURN_STATUS) == 0u) {  
       // 変換終了を待つ  
       ;  
     }  
     adcResult[CH0_N] = ADC_LIMIT(ADC_GetResult16(CH0_N));  
     adcResult[CH1_N] = ADC_LIMIT(ADC_GetResult16(CH1_N));  
     adcResult[CH2_N] = ADC_LIMIT(ADC_GetResult16(CH2_N));  
     // Polling Debouncer Rising Edgedを検出  
     sw1 = Pin_5_Read();  
     if (sw1 && !prevSw1) {  
       sw1Count++;  
     }  
     sw2 = Pin_7_Read();  
     if (sw2 && !prevSw2) {  
       sw2Count++;  
     }  
     /* Print voltage value to UART */  
     sprintf(  
       uartLine, "ADC: %4d %4d %4d SW1: %d %d %lu SW2: %d %d %lu",  
       adcResult[CH0_N], adcResult[CH1_N], adcResult[CH2_N],   
       sw1, prevSw1, sw1Count, sw2, prevSw2, sw2Count  
       );  
     prevSw1 = sw1;  
     prevSw2 = sw2;  
     UART_PutString(uartLine);  
     UART_PutCRLF();  
     CyDelay(100);  
   }  
 }  

ADC_SAR_SEQ

ハードウェア割込みで使う場合とほとんど同じだが、値が条件の範囲に収まっているかどうかの判定は割込みを通してではないと使えない。
→マイナスの値が出てしまうのでソフトウェアで処理した

読み取り値を平均化するAverage ModeはPollingでも使えるようだ

Sample ModeはFree Runningでも大丈夫だと思うが
Hardware Triggerにしてプログラムで明示的にADC_StartConvert() APIを呼び出して
変換を開始するようにした

Debouncer

ロジック回路で(CPUとは独立に)動作するので使うことにした

入力用のPin_4、Pin_6は設定でPullupモードにしている

NOTコンポーネントで反転してDebouncerのdに入力、
qからPINに出力している


qはチャタリングを除去しただけの出力だ

これをプログラムでPIN_Read() APIを呼び出してPollingしている

SW_Tx_UART

UARTのコンポーネントはいくつかあるが、このコンポーネントが一番リソースが少なくて済むらしい

Txだけしか使えないが、PutString()やPutCRLF()など便利なAPIがある


Pollingでもうまく動いてくれたようですが
波形生成と組み合わせてどうなることやら。。。

0 件のコメント:

コメントを投稿