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