问题描述-1
想实现的功能是,通过ADC实时测量某引脚的电压及其占空比。
可以通过旋转电位器,更改其电压。
首先我定义了这几个变量
cpp
uint32_t adc_value;//HAL库函数里面得出的采样值(实时更新)
uint32_t percentage6;//占空比,随着adc_value变化而变化
uint32_t percentage7;//占空比,随着adc_value变化而变化
然后在while循环里面不断测量adc的采样值
cpp
adc_value = HAL_ADC_GetValue(hadc);
同样的在while循环里面不断更新这两个占空比的值。
cpp
percentage6 = adc_value / 4096;
percentage7 = adc_value / 4096;
但是会发现percentage6,percentage7的值总是0.
之前一直没想到小数的问题(太久不写代码了,悲).
解决方案-1
就是把赋值过程改成浮点数再转换成整数。
cpp
percentage6 = ((float)adc_value / 4096.0f)*100;
percentage7 = ((float)adc_value / 4096.0f)*100;
这样出来就是整数了
percentage6 = 80。。。等等\
ok解决
问题二:
实际上面的过程我都是用函数实现的。
把lcd_show()放在while里面循环执行。
cpp
void lcd_show()
{
percentage6 = ((float)adc_value / 4096.0f)*100;
percentage7 = ((float)adc_value / 4096.0f)*100;
if (Page == 0 && mode == 0)
{
sprintf(text, " Data ");
LCD_DisplayStringLine(Line0, (uint8_t *)text);
sprintf(text, " V:%.2fV ", get_vol(&hadc2));
LCD_DisplayStringLine(Line2, (uint8_t *)text);
sprintf(text, " Mode:AUTO ");
LCD_DisplayStringLine(Line4, (uint8_t *)text);
}
else if (Page == 0 && mode == 1)
{
sprintf(text, " Data ");
LCD_DisplayStringLine(Line0, (uint8_t *)text);
sprintf(text, " V:%.2fV ", get_vol(&hadc2));
LCD_DisplayStringLine(Line2, (uint8_t *)text);
sprintf(text, " Mode:MANU ");
LCD_DisplayStringLine(Line4, (uint8_t *)text);
}
else if (Page == 1)
{
sprintf(text, " Para ");
LCD_DisplayStringLine(Line0, (uint8_t *)text);
sprintf(text, " PA6:%d ",percentage6);
LCD_DisplayStringLine(Line2, (uint8_t *)text);
sprintf(text, " PA7:%d ",percentage7);
LCD_DisplayStringLine(Line4, (uint8_t *)text);
}
}
cpp
double get_vol(ADC_HandleTypeDef *hadc)
{
HAL_ADC_Start(hadc);
adc_value = HAL_ADC_GetValue(hadc);
return 3.3 * adc_value / 4096;
}
但是在调试的时候发现,percentage的值只能更新一次,但是adc_value的值是不断变化的
解决二:
这是因为,在lcd_show()函数实现的开头赋值的时候,没更新adc_value的值。

在开头加上这个函数重新更新一遍就好了。
cpp
get_vol(ADC_HandleTypeDef *hadc)
记录学习。