【极海 APM32E103VET6S MINI开发板评测】之五:软件触发ADC
[复制链接]
我认为ADC和定时器是STM32F103之中的难点,因为线头太多,而今天我要搞个最简单的ADC,那就是软件触发的ADC
首先CUBEMX接上次的增加一个PC3,就是点开PC3选择ADC13道。
然后,到模拟那个左边项,用默认就行。
最主要是程序的编制,我参考网上的软件触发的方法,程序如下:
/* USER CODE BEGIN 0 */
uint16_t Get_Adc(uint32_t ch)
{
ADC_ChannelConfTypeDef ADC1_ChanConf;
ADC1_ChanConf.Channel=ch; //通道
ADC1_ChanConf.Rank=1; //第1个序列,序列1
ADC1_ChanConf.SamplingTime=ADC_CONVERSIONCLOCKCYCLES_SAMPLETIME_239CYCLES5; //采样时间
//ADC1_ChanConf.Offset=0;
HAL_ADC_ConfigChannel(&hadc1,&ADC1_ChanConf); //通道配置
HAL_ADC_Start(&hadc1); //开启ADC
HAL_ADC_PollForConversion(&hadc1,10); //轮询转换
return (uint16_t)HAL_ADC_GetValue(&hadc1); //返回最近一次ADC1规则组的转换结果
}
uint16_t Get_Adc_Average(uint32_t ch,uint8_t times)
{
uint32_t temp_val=0;
uint8_t t;
for(t=0;t<times;t++)
{
temp_val+=Get_Adc(ch);
HAL_Delay(5);
}
return temp_val/times;
}
/* USER CODE END 0 */
/**
* [url=home.php?mod=space&uid=159083]@brief[/url] The application entry point.
* @retval int
*/
int main(void)
{
/* USER CODE BEGIN 1 */
uint16_t dutyCycle=0;
uint8_t dir=1;
uint16_t adcx=0; //定义ADC采集存放的变量
float ADC_V=0; //存放电压
/* USER CODE END 1 */
在main.c里定义两个变量,然后在while里加入代码:
adcx = Get_Adc_Average(ADC_CHANNEL_13,10); //获取ADC1的通道1,10次的平均值
ADC_V=(float)adcx*(3.3/65536); //获取计算后的带小数的实际电压值,比如3.1111
由于没有涉及到串口,我就用断点仿真,当我把PC3接到地时GND,值为0000
当我接到VDD时显示是0x0FDB好像。
这样就完成了软件触发。
|