首页 论坛 原厂专区 ST MCU 请各位帮忙看一下使用TIM1触发AD转换大部分AD转换不准确

发帖 回复

[求助] 请各位帮忙看一下使用TIM1触发AD转换大部分AD转换不准确
936 查看
4 回复
 楼主 | 发布于 2018-07-16 | 只看楼主
分享到:

现在AD口使用TIM1触发AD转换大部分AD转换不准确 13个转换,只有3个是准确的,通道0、1、2是准确的,其他都不准确

 

上升中断采样  U_AD   V_AD      初始化AD1转换 其他通道

               ↓ 下降中断  AD1采样其他中断,AD2不采样, AD1再次指向U_AD

 

疑问?

1、定时器TIM1触发哪些引脚上升中断采样?

2、定时器TIM1触发哪些引脚下降中断采样?

3、哪些引脚采样是正确的,哪些是不正确的?

初始化:
void ini_ad1()
{
	NVIC_InitTypeDef  	 NVIC_InitStructure;
	
	RCC->APB2ENR |= 1<<9;	//使能ADC1时钟	 
	RCC->CFGR |=(2<<14);   	//ADC分频因子  4分频
	
	ADC1->CR1 = (0<<16);  //+(1<<5);//设置注入同步,开启注入中断
	ADC1->CR2 = (1<<15)+(0<<20);//ADC1上电,设置左右对齐,设置为TROG事件
	ADC1->SMPR1 = 0;		//采样为1.5个周期
	ADC1->SMPR2 = 0;	//采样为1.5个周期  采样频率为14MHZ
	ADC1->SQR3 =1;
	ADC1->CR2 |= 9;
	while(ADC1->CR2 & 8){}
	ADC1->CR2 |= 5;
	while(ADC1->CR2 & 4){}
}
上升沿中断读取AD值:
		if(!(SIGN_1.STOP_electric_bit))
		{
			while(!(ADC1->SR & 4)){}
			U_adc = ADC1->JDR1 & 0xfff;
			while(!(ADC2->SR & 4)){}
			V_adc = ADC2->JDR1 & 0xfff;
		}
		ADC1->SR = 0;
		ADC2->SR = 0;
上升沿中断换AD通道:
void time1_ad_updata()
{
	unsigned int i=AD_counter;
	if(i & 0xfff)
	{
		ADC1->CR2 &= ~1;
		return;
	}
	switch((i>>12) & 0xf)
	{
		case 0:
			ADC1->SQR3 = 0;
//			ADC1->CR2 |= 1;
			break;
		case 1:
			ADC1->SQR3 = 3;
//			ADC1->CR2 |= 1;
			break;
		case 2:
			ADC1->SQR3 = 4;
//			ADC1->CR2 |= 1;
			break;
		case 3:
			ADC1->SQR3 = 5;
//			ADC1->CR2 |= 1;
			break;
		case 4:
			ADC1->SQR3 = 6;
//			ADC1->CR2 |= 1;
			break;
		case 5:
			ADC1->SQR3 = 7;
//			ADC1->CR2 |= 1;
			break;
		case 6:
			ADC1->SQR3 = 11;
//			ADC1->CR2 |= 1;
			break;
		case 7:
			ADC1->SQR3 = 12;
//			ADC1->CR2 |= 1;
			break;
		case 8:
			ADC1->SQR3 = 14;
//			ADC1->CR2 |= 1;
			break;
		case 9:
			ADC1->SQR3 = 13;
//			ADC1->CR2 |= 1;
			break;
		default:
			ADC1->CR2 &= ~1;
			break;
	}
}
下降沿中断读AD值:
void read_other_ad()
{
	if(!(SIGN_1.STOP_electric_bit))
	{
		switch(ADC1->SQR3 & 0x1F)
		{
			case 0:
				while(!(ADC1->SR & 4)){}
				adc_30v_data = ADC1->JDR1 & 0xfff;
				break;
			case 3:
				while(!(ADC1->SR & 4)){}
				adc_led_i_data = ADC1->JDR1 & 0xfff;
				break;
			case 4:
				while(!(ADC1->SR & 4)){}
				adc_5v_i_data = ADC1->JDR1 & 0xfff;
				break;
			case 5:
				while(!(ADC1->SR & 4)){}
				adc_12v_i_data = ADC1->JDR1 & 0xfff;
				break;
			case 6:
				while(!(ADC1->SR & 4)){}
				adc_30v_i_data = ADC1->JDR1 & 0xfff;
				break;
			case 7:
				while(!(ADC1->SR & 4)){}
				adc_5v_data = ADC1->JDR1 & 0xfff;
				break;
			case 11:
				while(!(ADC1->SR & 4)){}
				adc_bat30v_data = ADC1->JDR1 & 0xfff;
				break;
			case 12:
				while(!(ADC1->SR & 4)){}
				adc_bat_data = ADC1->JDR1 & 0xfff;
				break;
			case 13:
				while(!(ADC1->SR & 4)){}
				adc_hot_data = ADC1->JDR1 & 0xfff;
			case 14:
				while(!(ADC1->SR & 4)){}
				adc_12v_data = ADC1->JDR1 & 0xfff;
				break;
			default:
				break;
		}
	}
	ADC1->SR = 0;
	ADC1->SQR3 =1;
	ADC2->CR2 |= 1;
	ADC1->CR2 |= 1;
}
T1中断(去掉不必要的):
void TIM1_UP_IRQHandler(void)	
{
	TIM1->SR = 0;
	if(TIM1->CR1 & 0X10)
	{
		if(!(SIGN_1.STOP_electric_bit))
		{
			while(!(ADC1->SR & 4)){}
			U_adc = ADC1->JDR1 & 0xfff;
			while(!(ADC2->SR & 4)){}
			V_adc = ADC2->JDR1 & 0xfff;
		}
		ADC1->SR = 0;
		ADC2->SR = 0;
		ADC2->CR2 &= ~1;
		time1_ad_updata();
	}
	else
	{
		read_other_ad();
	}
}

                        
(0 ) (0 )
回复 举报

回复于 2018-07-16 沙发

都是寄存器的;

(0 )
评论 (0) 举报

回复于 2018-07-16 2#

最大的问题,居然没说是什么芯片。。。
(0 )
评论 (2) 举报

回复于 2018-07-17 3#

多谢分享!!!
(0 )
评论 (0) 举报

回复于 2020-02-08 4#

感谢分享
(0 )
评论 (0) 举报
  • 发表回复
    0/3000





    举报

    请选择举报类别

    • 广告垃圾
    • 违规内容
    • 恶意灌水
    • 重复发帖

    全部板块

    返回顶部