分享到:
现在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 )
回复
举报
-
- 0000000000000000
-
1888 发帖7917 回复34980 积分
- 私信他 +关注
发表回复
版
块
导
航
块
导
航
举报
请选择举报类别
- 广告垃圾
- 违规内容
- 恶意灌水
- 重复发帖

发帖
回复
楼主