General update for all
This commit is contained in:
Submodule firmware/ch32v003fun updated: fe86ce83da...e27dbed0b9
@@ -8,17 +8,34 @@
|
||||
|
||||
uint32_t count;
|
||||
|
||||
#define ABSOLUTE_MAX_ADC_SET 368 //172 volts (definitely do not exceed)
|
||||
#define PWM_PERIOD 70
|
||||
#define PWM_MAXIMUM_DUTY 40
|
||||
#define ABSOLUTE_MAX_ADC_SET 384 //180 volts (definitely do not exceed)
|
||||
|
||||
// Specifically, 84 and 38 are tuned for this specific circuit.
|
||||
// Do not mess with them unless you know what you are doing.
|
||||
#define PWM_PERIOD 84
|
||||
#define PWM_MAXIMUM_DUTY 38
|
||||
|
||||
#define ERROR_P_TERM 0 // Actually a shift. 0 is rattl-y but averages out and gives tight control.
|
||||
|
||||
int target_feedback = 0;
|
||||
int lastadc = 0;
|
||||
int fade_enable = 0;
|
||||
int fade_time0;
|
||||
int fade_time1;
|
||||
int fade_disp0;
|
||||
int fade_disp1;
|
||||
int fade_place = 0;
|
||||
|
||||
static void ApplyOnMask( uint16_t onmask )
|
||||
{
|
||||
GPIOD->OUTDR = onmask >> 8;
|
||||
GPIOC->OUTDR = onmask & 0xff;
|
||||
}
|
||||
|
||||
void ADC1_IRQHandler(void) __attribute__((interrupt));
|
||||
void ADC1_IRQHandler(void)
|
||||
{
|
||||
// This interrupt should happen ~3.5uS on current settings.
|
||||
int adc = lastadc = ADC1->RDATAR;
|
||||
int err = target_feedback - adc;
|
||||
ADC1->STATR &= ~ADC_EOC;
|
||||
@@ -32,7 +49,19 @@ void ADC1_IRQHandler(void)
|
||||
TIM1->CH2CVR = err;
|
||||
}
|
||||
|
||||
count++;
|
||||
if( fade_enable )
|
||||
{
|
||||
int fadepos = count & 0xff;
|
||||
if( fadepos < fade_time0 )
|
||||
ApplyOnMask( fade_disp0 );
|
||||
else if( fadepos == fade_time0 )
|
||||
ApplyOnMask( 0 );
|
||||
else if( fadepos < fade_time1 )
|
||||
ApplyOnMask( fade_disp1 );
|
||||
else
|
||||
ApplyOnMask( 0 );
|
||||
count++;
|
||||
}
|
||||
}
|
||||
|
||||
static void SetupTimer()
|
||||
@@ -109,6 +138,71 @@ static void SetupADC()
|
||||
ADC1->CTLR1 = ADC_EOCIE;
|
||||
}
|
||||
|
||||
uint16_t GenOnMask( int segmenton )
|
||||
{
|
||||
if( segmenton > 0 )
|
||||
{
|
||||
segmenton--;
|
||||
if( segmenton < 8 )
|
||||
return 1<<segmenton;
|
||||
else if( segmenton == 8 )
|
||||
return (1<<2)<<8;
|
||||
else if( segmenton == 9 )
|
||||
return (1<<3)<<8;
|
||||
else if( segmenton == 10 )
|
||||
return (1<<0)<<8;
|
||||
else if( segmenton == 11 )
|
||||
return (1<<7)<<8;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void HandleCommand( uint32_t dmdword )
|
||||
{
|
||||
// ./minichlink -s 0x04 0x01110040
|
||||
// ./minichlink -g 0x04
|
||||
// It is a valid status word back from the PC.
|
||||
int command = dmdword & 0x0f;
|
||||
switch( command )
|
||||
{
|
||||
case 1:
|
||||
{
|
||||
int feedback = dmdword>>16;
|
||||
if( feedback > ABSOLUTE_MAX_ADC_SET ) feedback = ABSOLUTE_MAX_ADC_SET;
|
||||
target_feedback = feedback;
|
||||
break;
|
||||
}
|
||||
case 2:
|
||||
{
|
||||
int segmenton = (dmdword>>16)&0x0f;
|
||||
|
||||
// Disable all fading.
|
||||
fade_enable = 0;
|
||||
|
||||
ApplyOnMask( GenOnMask( segmenton ) );
|
||||
break;
|
||||
}
|
||||
case 3:
|
||||
{
|
||||
// Configure a fade.
|
||||
int disp0 = ( dmdword >> 8 ) & 0xf;
|
||||
int disp1 = ( dmdword >> 12 ) & 0xf;
|
||||
int time0 = ( dmdword >> 16 ) & 0xff;
|
||||
int time1 = ( dmdword >> 24 ) & 0xff;
|
||||
|
||||
fade_time0 = time0;
|
||||
fade_time1 = time1;
|
||||
fade_disp0 = GenOnMask( disp0 );
|
||||
fade_disp1 = GenOnMask( disp1 );
|
||||
fade_enable = 1;
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
*DMDATA0 = lastadc << 16;
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
SystemInit48HSI();
|
||||
@@ -146,6 +240,8 @@ int main()
|
||||
|
||||
*DMDATA0 = 0;
|
||||
|
||||
target_feedback = 0;
|
||||
|
||||
while(1)
|
||||
{
|
||||
GPIOD->BSHR = 1<<6;
|
||||
@@ -153,37 +249,7 @@ int main()
|
||||
uint32_t dmdword = *DMDATA0;
|
||||
if( (dmdword & 0xf0) == 0x40 )
|
||||
{
|
||||
// ./minichlink -s 0x04 0x01110040
|
||||
// ./minichlink -g 0x04
|
||||
|
||||
// It is a valid status word back from the PC.
|
||||
int feedback = dmdword>>20;
|
||||
if( feedback > ABSOLUTE_MAX_ADC_SET ) feedback = ABSOLUTE_MAX_ADC_SET;
|
||||
target_feedback = feedback;
|
||||
|
||||
int segmenton = (dmdword>>16)&0x0f;
|
||||
// Other various things are lower.
|
||||
|
||||
// Turn everything off.
|
||||
GPIOC->BSHR = 0xff<<16;
|
||||
GPIOD->BSHR = 0b10001101 << 16;
|
||||
|
||||
if( segmenton >= 1 )
|
||||
{
|
||||
segmenton--;
|
||||
if( segmenton < 8 )
|
||||
GPIOC->BSHR = 1<<segmenton;
|
||||
else if( segmenton == 8 )
|
||||
GPIOD->BSHR = 1<<2;
|
||||
else if( segmenton == 9 )
|
||||
GPIOD->BSHR = 1<<3;
|
||||
else if( segmenton == 10 )
|
||||
GPIOD->BSHR = 1<<0;
|
||||
else if( segmenton == 11 )
|
||||
GPIOD->BSHR = 1<<7;
|
||||
}
|
||||
|
||||
*DMDATA0 = lastadc << 16;
|
||||
HandleCommand( dmdword );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,10 +6,10 @@
|
||||
#include "../../ch32v003fun/minichlink/minichlink.h"
|
||||
|
||||
int targetnum = 0;
|
||||
|
||||
int lastsettarget = -1;
|
||||
#define VOLTAGE_SCALE 2.01
|
||||
|
||||
const char * targdisp[] = { " ", "0", "9", "8", "7", "6", "5", "4", "3", "2", "1", ".", "N" };
|
||||
const char * targdisp[] = { "F", " ", "0", "9", "8", "7", "6", "5", "4", "3", "2", "1", ".", "N" };
|
||||
void HandleKey( int keycode, int bDown )
|
||||
{
|
||||
if( bDown )
|
||||
@@ -29,6 +29,7 @@ void HandleKey( int keycode, int bDown )
|
||||
case '0': targetnum = 1; break;
|
||||
case '-': case '_': targetnum = 11; break;
|
||||
case '=': case '+': targetnum = 12; break;
|
||||
case 'f': case 'F': targetnum = -1; break;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -74,18 +75,49 @@ int main()
|
||||
do_set = 0;
|
||||
float set_v = 450 - sety;
|
||||
set_v = set_v/2;
|
||||
if( set_v > 0 && set_v < 180 )
|
||||
if( set_v > 0 && set_v < 195 )
|
||||
{
|
||||
rmask = ( ( (uint32_t)(set_v * VOLTAGE_SCALE) ) << 20 ) | 0x40;
|
||||
rmask = ( ( (uint32_t)(set_v * VOLTAGE_SCALE) ) << 16 ) | 0x41;
|
||||
}
|
||||
}
|
||||
MCF.WriteReg32( dev, 0x04, rmask | targetnum << 16 );
|
||||
else if( targetnum == -1 )
|
||||
{
|
||||
// Fade Demo
|
||||
static int fadeplace;
|
||||
fadeplace+=2;
|
||||
int fadegroup = (fadeplace)>>8;
|
||||
int timeinfade = fadeplace&0xff;
|
||||
int time0 = timeinfade;
|
||||
int time1 = 255;
|
||||
int disp0 = 10-((fadegroup+1)%11);
|
||||
int disp1 = 10-((fadegroup+0)%11);
|
||||
rmask = (time1<<24)|(time0<<16)|(disp1<<12)|(disp0<<8)|0x43;
|
||||
}
|
||||
else if( lastsettarget != targetnum )
|
||||
{
|
||||
rmask = 0x00000042 | (targetnum<<16);
|
||||
lastsettarget = targetnum;
|
||||
}
|
||||
else
|
||||
{
|
||||
rmask = 0x00000040;
|
||||
MCF.WriteReg32( dev, 0x04, 0x00000040 );
|
||||
}
|
||||
|
||||
MCF.WriteReg32( dev, 0x04, rmask );
|
||||
|
||||
uint32_t status = 0xffffffff;
|
||||
int r = MCF.ReadReg32( dev, 0x04, &status );
|
||||
int r;
|
||||
retry:
|
||||
r = MCF.ReadReg32( dev, 0x04, &status );
|
||||
if( ( status & 0xc0 ) == 0x40 ) goto retry;
|
||||
if( r ) { printf( "R: %d\n", r ); status = 0; goto retry; }
|
||||
|
||||
printf( "%08x\n", status );
|
||||
float voltage = ((float)(status>>16))/VOLTAGE_SCALE;
|
||||
volthist[volthisthead] = voltage;
|
||||
volthisthead = (volthisthead + 1) % VOLTHISTSIZE;
|
||||
CNFGColor( (voltage > 180)?0xff0000ff:GLOW );
|
||||
CNFGColor( (voltage > 183)?0xff0000ff:GLOW );
|
||||
CNFGPenX = 1;
|
||||
CNFGPenY = 1;
|
||||
char cts[128];
|
||||
@@ -96,7 +128,7 @@ int main()
|
||||
{
|
||||
CNFGPenX = 200+x;
|
||||
CNFGPenY = 1+y;
|
||||
CNFGDrawText( targdisp[targetnum], 10 );
|
||||
CNFGDrawText( targdisp[targetnum+1], 10 );
|
||||
}
|
||||
|
||||
int i;
|
||||
@@ -104,9 +136,9 @@ int main()
|
||||
float vl = voltage;
|
||||
|
||||
CNFGColor( 0xff0000ff );
|
||||
CNFGTackSegment( 0, 450-180*2, w, 450-180*2 );
|
||||
CNFGPenX = w - 250; CNFGPenY = 450-180*2-10;
|
||||
CNFGDrawText( "WARNING: DO NOT EXCEED THIS LINE (180V)", 2 );
|
||||
CNFGTackSegment( 0, 450-180*2-6, w, 450-180*2-6 );
|
||||
CNFGPenX = w - 250; CNFGPenY = 450-180*2-10-6;
|
||||
CNFGDrawText( "WARNING: DO NOT EXCEED THIS LINE (183V)", 2 );
|
||||
|
||||
for( i = 0; i < 9; i++ )
|
||||
{
|
||||
@@ -123,7 +155,6 @@ int main()
|
||||
for( i = 0; i < w; i++ )
|
||||
{
|
||||
float v = volthist[vhp];
|
||||
if( v == 0 ) break;
|
||||
CNFGTackSegment( i, 450 - vl*2, i+1, 450 - v*2 );
|
||||
vhp = (vhp - 1 + VOLTHISTSIZE*100)%VOLTHISTSIZE;
|
||||
//printf( "%f\n", v );
|
||||
@@ -131,7 +162,7 @@ int main()
|
||||
}
|
||||
|
||||
CNFGSwapBuffers();
|
||||
} while( 1 );
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1011,8 +1011,8 @@
|
||||
(effects (font (size 1.27 1.27)) (justify left bottom))
|
||||
(uuid 47c5a941-5ea6-4692-87af-c0393bd2065d)
|
||||
)
|
||||
(text "Changes in RevA\n * Probably remove HVIMON >> DEFINITELY\n * Include pull-down on HVCTL >> DEFINITELY.\n * Monitor ripple on HVP\n\nMod per Ivan."
|
||||
(at 24.13 147.32 0)
|
||||
(text "Changes in RevA\n * Probably remove HVIMON >> DEFINITELY\n * Include pull-down on HVCTL >> DEFINITELY.\n * Monitor ripple on HVP (NOT AN ISSUE)\n\nTODO:\nMod HW per Ivan.\n * Ripple is TINY. Can use smaller output cap. 100nF?\n * Output reverse-V is baaad. Maybe add a diode & cap to inverse rail of flyback?\n * Keep P7 on DIG_AUX.\n * Shrink binding post holes.\n * Mark off which pin on header is PGM\n * Reduce power to comma\n * Switch resistors to 15k"
|
||||
(at 16.51 166.37 0)
|
||||
(effects (font (size 1.27 1.27)) (justify left bottom))
|
||||
(uuid 5c570b8c-e31c-47bd-a56b-23a2e3a9d6d7)
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user