我一直在研究我的升压转换器项目的c代码。一旦嵌入的代码上传到ilmatto(微处理器),电压就会稳定到Vwanted的初始值,在我的情况下是4。
但是,当我使用主程序发送替换Vwanted的值时出现问题,Vwanted的值确实被替换,但输出电压的值保持为4,这是替换之前的Vwanted值。
我试图printf Vwanted的值,检查替换是否成功,并且确实如此!
所以,我怀疑最初内部为(;;)运行,但是在Vwanted的替换值之后,程序再也不会进入内部for(;;)。当我使用putty和uart cable来观察返回数据时就证明了这一点。它打印"。"最初,没有我输入Vwanted的新值。但是稍后当输入新的Vwanted值时,putty不会打印任何内容。
如果这是真的,则意味着外部for(;;)循环似乎不起作用。
请帮帮我!!!
这里我在embedded.c程序中包含main函数,
int main(void)
{
uint16_t cnt =0;
int duty_value = 210;
char cmd[BUFFSIZE];
//char tail[BUFFSIZE];
int prm;
int res;
init_stdio2uart0();
init_pwm();
init_adc();
double Vwanted = 4; //initialise voltage
double *ptr = &Vwanted;
//pwm_duty(duty_value);
double v_out;
double Verror;
/* set LED pin as an output */
DDRB |= _BV(PINB7);
printf("\r\nIlMatto Coms READY!\r\n");
for(;;)
{
/* Following idea from jwaf1g14*/
for(;;)
{
v_out = v_load()/0.150;
Verror = Vwanted - v_out;
printf(".");
if (Verror < 0)
{
if (Verror < -4)
{
duty_value = duty_value - 2;
pwm_duty(duty_value); /* Limited by PWM_DUTY_MAX */
}
else if (Verror > -4)
{
duty_value = duty_value - 1;
pwm_duty(duty_value); /* Limited by PWM_DUTY_MAX */
}
}
else if (Verror > 0)
{
if (Verror > 4)
{
duty_value = duty_value + 2;
pwm_duty(duty_value); /* Limited by PWM_DUTY_MAX */
}
else if (Verror < 4)
{
duty_value = duty_value + 1;
pwm_duty(duty_value); /* Limited by PWM_DUTY_MAX */
}
}
else
{
pwm_duty(duty_value); /* Limited by PWM_DUTY_MAX */
}
if(kbhit()) // Check if there is an input available
{
res = scanf("%s %u", cmd, &prm);
printf("%04d: CMD was: \"%s\" with %d (%d)\r\n", cnt, cmd, prm, res);
break;
}
//printf( " Vout --> %5.3f V\r\n", v_out );
}/*End of inner forever loop*/
if ( res !=2 )/* Error! */
{
printf("Your serial connection is broken!!!");
//scanf("%*s"); /* Clear input buffer */
//fflush(stdin);
}
else
{
if ( prm > 12 || prm < 1)
{
printf("The setpoint entered cannot be achieved");
/* Set pin B7 high */
PORTB |= _BV(PINB7);
_delay_ms(100);
/* Set pin B7 low */
PORTB &= ~_BV(PINB7);
_delay_ms(900);
}
else if ( prm < 12 && prm > 1)
{
*ptr = (double)prm;
printf("Vset is %f,", Vwanted);
//printf("Hello");
}
}
}/*End of outer forever loop*/
return 0;
}/*End of main loop*/
答案 0 :(得分:2)
你的循环以return Vwanted;
结尾,它将从主函数返回,结束你的程序。消除该行将允许您的外循环继续。我怀疑你不想从这个功能中返回任何东西。