Sten Martin
New Member
Fast pwmout to create a 50Hz Sine Wave
I want to test if I can use a PICAXE 08M2 or 08X2 to pulse a Sine-wave with a H-Bridge fast enough. I need some help with the code.
The output data is 200 - 256 bytes (the resolution/duty of the period).
The output frequency of the period Sine-wave is 50 Hz.
So, the PWM frequency = 256 (resolution) x 50Hz = 12.8 kHz or = 10kHz with a resolution of 200.
256 updates per 20mS (50Hz) would be an update every 78uS or 100uS (@ 200 updates)
I have had a suggestion from "hippy" to poke the duty register sfr direct for speed.
This is the suggestion:
#Picaxe 08M2
Symbol CCPR1L = $B1 ' $291
SetFreq X32
PwmOut 2, 100, 0 // pin, period, duty
Do
PokeSfr CCPR1L, 80 // hex
PokeSfr CCPR1L, 83
PokeSfr CCPR1L, 86
256 times for all the output data
Loop
Use some PAUSEUS padding to get it close to 50Hz.
I need som help with this code. Where can I read about the CCPR1L, I assume it is the duty register. How did you obtain the period and duty in the pwmout command?
What is the pwmout doing with the output data? Is it doing an analog signal with the output voltage corresponding to the given sine wave data? What format can I use in the data (hex, binary and decimal)?
I want to test if I can use a PICAXE 08M2 or 08X2 to pulse a Sine-wave with a H-Bridge fast enough. I need some help with the code.
The output data is 200 - 256 bytes (the resolution/duty of the period).
The output frequency of the period Sine-wave is 50 Hz.
So, the PWM frequency = 256 (resolution) x 50Hz = 12.8 kHz or = 10kHz with a resolution of 200.
256 updates per 20mS (50Hz) would be an update every 78uS or 100uS (@ 200 updates)
I have had a suggestion from "hippy" to poke the duty register sfr direct for speed.
This is the suggestion:
#Picaxe 08M2
Symbol CCPR1L = $B1 ' $291
SetFreq X32
PwmOut 2, 100, 0 // pin, period, duty
Do
PokeSfr CCPR1L, 80 // hex
PokeSfr CCPR1L, 83
PokeSfr CCPR1L, 86
256 times for all the output data
Loop
Use some PAUSEUS padding to get it close to 50Hz.
I need som help with this code. Where can I read about the CCPR1L, I assume it is the duty register. How did you obtain the period and duty in the pwmout command?
What is the pwmout doing with the output data? Is it doing an analog signal with the output voltage corresponding to the given sine wave data? What format can I use in the data (hex, binary and decimal)?
Code:
const int sinewave_length=256;
const unsigned char sinewave_data[] PROGMEM = {
0x80,0x83,0x86,0x89,0x8c,0x8f,0x92,0x95,0x98,0x9c, 0x9f,0xa2,0xa5,0xa8,0xab, 0xae,0xb0,0xb3,0xb6,0xb9,0xbc,0xbf,0xc1,0xc4,0xc7,0xc9, 0xcc,0xce,0xd1, 0xd3, 0xd5,0xd8,0xda,0xdc,0xde,0xe0,0xe2,0xe4,0xe6,0xe8,0xea,0xec, 0xed,0xef 0xf0, 0xf2, 0xf3,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfc,0xfd,0xfe, 0xfe,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfe,0xfd,0xfc, 0xfc,0xfb,0xfa,0xf9,0xf8,0xf7,
0xf6,0xf5,0xf3,0xf2,0xf0,0xef,0xed,0xec,0xea,0xe8, 0xe6,0xe4,0xe2,0xe0,0xde,0xdc,0xda,0xd8,0xd5,0xd3,0xd1,0xce, 0xcc,0xc9,0xc7, 0xc4, 0xc1,0xbf,0xbc,0xb9,0xb6,0xb3,0xb0,0xae,0xab,0xa8,0xa5,0xa2,0x9f,0x9c,0x98,0x95, 0x92,0x8f,0x8c,0x89, 0x86,0x83,
0x80,0x7c,0x79,0x76,0x73,0x70,0x6d,0x6a,0x67,0x63, 0x60,0x5d,0x5a,0x57,0x54,0x51,0x4f,0x4c,0x49,0x46,0x43,0x40,0x3e,0x3b,0x38,0x36, 0x33,0x31,0x2e,0x2c,0x2a,0x27,0x25,0x23,0x21,0x1f,0x1d,0x1b,0x19,0x17,0x15, 0x13, 0x12,0x10,0x0f,0x0d,0x0c,0x0a, 0x09,0x08,0x07,0x06,0x05,0x04,0x03, 0x03,0x02,0x01, 0x01,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0c,0x0d,0x0f,0x10,0x12,0x13,0x15,0x17, 0x19, 0x1b,0x1d,0x1f,0x21,0x23,0x25,0x27,0x2a,0x2c,0x2e,0x31,0x33,0x36,0x38,0x3b, 0x3e 0x40,0x43, 0x46, 0x49,0x4c,0x4f,0x51,0x54,0x57,0x5a,0x5d,0x60,0x63,0x67,0x6a, 0x6d,0x70, 0x73, 0x76,0x79,0x7c}
Last edited by a moderator: