MCU: C8051F330, Fmax: 23KHz
#include <stdio.h>
#include <stdlib.h>
unsigned char sine_table[8] = { 0x80, 0xDA, 0xFF, 0xDA, 0x80, 0x25, 0x00, 0x25 }; /* 8KSPS, 0dB */
// unsigned char sine_table[8] = { 0x80, 0xAD, 0xC0, 0xAD, 0x80, 0x52, 0x3F, 0x52 }; /* 8KSPS, -6dB */
unsigned char *waveform_data = &sine_table[0];
/* for generate 1KHz sine wave, call it per 125us */
unsigned char waveform_output(void)
{
unsigned char dac_value;
dac_value = *waveform_data++;
if (waveform_data >= &sine_table[8])
{
waveform_data = &sine_table[0];
}
return dac_value;
}
int main()
{
int i;
for (i = 0; i < 16; i++)
{
printf("%02X\n", waveform_output());
}
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
unsigned char *sine_table = NULL;
float db2liner(float dB)
{
return pow(10, dB / 20);
}
float liner2db(float liner)
{
return (20 * log10(liner));
}
int waveform_generate(int freq, int sps, float dB)
{
int i;
int table_length;
float A;
float value;
table_length = sps / freq;
sine_table = (unsigned char *)malloc(table_length);
memset(sine_table, 0, table_length);
A = db2liner(dB);
for( i = 0; i < table_length; i++)
{
value = A * sin(2 * M_PI * i * freq / sps);
if (value < 1.0)
{
sine_table[i] = (256 / 2) + value * (256 / 2); /* add DC offset */
}
else
{
sine_table[i] = 256 - 1;
}
}
return table_length;
}
int main()
{
int i, table_length;
/* generate 1000Hz sine wave, sample rate: 8000Hz, gain: -6dB */
table_length = waveform_generate(1000, 8000, -6);
printf("unsigned char sine_table[%d] = { ", table_length);
for (i = 0; i < table_length; i++)
{
printf((i != table_length - 1) ? "0x%02X, " : "0x%02X ", sine_table[i]);
}
printf("};\n");
free(sine_table);
return 0;
}