Skip to content

Software-Controlled Slew Rate #3

@electricalhog

Description

@electricalhog

Not in issue yet because I popped another MCU and need to figure out how that has anything to do with anything, really.

The concept should be complete but the implementation is missing a separate folder and typedef during the prototyping stage. I was hoping that the same ISR could be reused with global static flags to adjust both the current and voltage DAC outputs.

/* USER CODE BEGIN PV */
static double volts;
static double amps;
static uint32_t DAC_volts;
static uint32_t DAC_amps;
const int slew_volts = 1; // multiples of 12mV/us
const int slew_amps = 1; //multiples of 2.4mA/us
static char voltage_set;
static char current_set;
/* USER CODE END PV */
Global or otherwise safe-namespace variables

/* USER CODE BEGIN 0 */
static setVoltage(double voltage){
voltage_set = 0;
volts = voltage; // save local value to global for safe-keeping
DAC_volts = HAL_DAC_GetValue(&hdac3, DAC_CHANNEL_1); // save starting condition from DAC
HAL_TIM_Base_Start_IT(&htim3);
}
static setCurrent(double current){
current_set = 0;
amps = current; // save local value to global for safe-keeping
DAC_amps = HAL_DAC_GetValue(&hdac1, DAC_CHANNEL_1); // save starting condition from DAC
HAL_TIM_Base_Start_IT(&htim3);
}
static int DAC_Voltage(double voltage){ // voltage to DAC scaling function
int v = (int)(voltage-5.2733)/0.0119755;
return (v>0) ? v : 0;
}
static int DAC_Current(double current){ // current to DAC scaling function
int c = (int)((current*0.02*10)+0.25)*(4095/2);
return (c>0) ? c : 0;
}
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if (htim->Instance == TIM3) // 1us ISR for soft-slewing
{
if(voltage_set != 1) // voltage soft-slew active
{
if (DAC_volts < DAC_Voltage(volts)) // has not reached set-point
{
DAC_volts += slew_volts; // increment by constant
HAL_DAC_SetValue(&hdac3, DAC_CHANNEL_1, DAC_ALIGN_12B_R, DAC_volts); // write to DAC
}
else
{
voltage_set = 1;
}
}
if(current_set != 1) // current soft-slew active
{
if (DAC_amps < DAC_Current(amps)) // has not reached set-point
{
DAC_amps += slew_amps; // increment by constant
HAL_DAC_SetValue(&hdac1, DAC_CHANNEL_1, DAC_ALIGN_12B_R, DAC_amps); // write to DAC
}
else
{
current_set = 1;
}
}
if (current_set && voltage_set) // soft-slew complete
{
HAL_TIM_Base_Stop_IT(&htim3); // turn of timer
}
}
}
/* USER CODE END 0 */
Scaling functions, setting functions, and timer ISR

Metadata

Metadata

Labels

help wantedExtra attention is needed

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions