General update for all

This commit is contained in:
cnlohr
2023-04-21 19:12:02 -04:00
parent 28639822dc
commit ac578e98b8
4 changed files with 148 additions and 51 deletions

View File

@@ -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 );
}
}
}

View File

@@ -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;
}

View File

@@ -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)
)