1chずつなら動作した。
ブレッドボード図
Pin接続
SPIのクロックは8MHzまであげられるが、安全のためには4MHzぐらいで考えたほうがよさそうだ。
PSoC Creatorのプロジェクト
https://github.com/ryood/PSoC-DDS-MCP4922
(47.91MHz - 48MHz) / 48MHz = -0.1875%24MHz
(11.98MHz - 12MHz) / 12MHz = -0.16%
(24.02MHz - 24MHz) / 24MHz = 0.083%個体差はあるかもしれないが、24MHz駆動にしたほうが若干精度が高そうだ。
(12.01MHz - 12MHz) / 12MHz = 0.083%
#include <project.h>
CY_ISR(ISR_Timer_48kHz_Handler)
{
Timer_48kHz_ClearInterrupt(Timer_48kHz_INTR_MASK_TC);
Pin_ISR_48kHz_Write(1u);
//CyDelayUs(1);
Pin_ISR_48kHz_Write(0u);
}
CY_ISR(ISR_Timer_96kHz_Handler)
{
Timer_96kHz_ClearInterrupt(Timer_96kHz_INTR_MASK_TC);
Pin_ISR_96kHz_Write(1u);
Pin_ISR_96kHz_Write(0u);
}
int main()
{
CyGlobalIntEnable; /* Enable global interrupts. */
/* Place your initialization/startup code here (e.g. MyInst_Start()) */
ISR_Timer_48kHz_StartEx(ISR_Timer_48kHz_Handler);
ISR_Timer_96kHz_StartEx(ISR_Timer_96kHz_Handler);
Timer_48kHz_Start();
Timer_96kHz_Start();
for(;;)
{
/* Place your application code here. */
}
}
OV: (47.69kHz - 48kHz) / 48kHz = だいたい -0.646%
ISR: (47.77kHz - 48kHz) / 48kHz = だいたい -0.479%
3.30us - 1us = 2.3usで、またそれなりのオーバーヘッドがある。
OV: (95.09kHz - 96kHz) / 96kHz = だいたい -0.948%拡大
ISR: (95.24kHz - 96kHz) / 96kHz = だいたい -0.792%
(1)PD: 2.330usオシロ(OWON SDS7102)の精度もよくわからないが、1%ぐらいの精度は出るのかな。PSoC 4のClockの精度は±2%になっているのでこんなもんかな。
(2)PW: 1.000us
Release Mode: Flash: 2048B SRAM:1436</追記>
Debug Mode: Flash 2304B SRAM:1436
#define F_CPU 9600000
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
ISR (ANA_COMP_vect)
{
if (ACSR & (1 << ACO))
{
PORTB |= (1 << PB4);
}
else
{
PORTB &= ~(1 << PB4);
}
}
int main(void)
{
DDRB = 0x00;
// LED output
DDRB |= (1 << PB4);
// AIN1をバンドギャップ・リファレンス、割込み有効化
ACSR = (1 << ACBG) | (1 << ACIE);
sei();
while(1)
{
}
}
LED点灯時: 1.171Vまあまあ1Vあたりで切り替わるようだ。
LED消灯時: 0.951V