普通に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 件のコメント:
コメントを投稿