新手上路
- 积分
- 28
- 金钱
- 28
- 注册时间
- 2018-7-5
- 在线时间
- 4 小时
|
1金钱
在复制程序时,注释乱码。
程序采用定时中断,每次中断采集adc1进行PID运算,测试后工作正常,之后引入第2路Ad做过载保护,LCD屏幕乱码,只显示无意义数字。
所用程序,全部改自原子哥例程。
void Adc_Init(void)
{
ADC_InitTypeDef ADC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC1 , ENABLE );
RCC_ADCCLKConfig(RCC_PCLK2_Div6);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOA, &GPIO_InitStructure);
ADC_DeInit(ADC1);
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_InitStructure.ADC_ScanConvMode = DISABLE;
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_NbrOfChannel = 1;
ADC_Init(ADC1, &ADC_InitStructure);
ADC_Cmd(ADC1, ENABLE); //ʹÄÜÖ¸¶¨µÄADC1
ADC_ResetCalibration(ADC1); //ʹÄܸ´Î»Ð£×¼
while(ADC_GetResetCalibrationStatus(ADC1)); //µÈ´ý¸´Î»Ð£×¼½áÊø
ADC_StartCalibration(ADC1); //¿ªÆôADУ׼
while(ADC_GetCalibrationStatus(ADC1)); //µÈ´ýУ׼½áÊø
ADC_SoftwareStartConvCmd(ADC1, ENABLE); //ʹÄÜÖ¸¶¨µÄADC1µÄÈí¼þת»»Æô¶¯¹¦ÄÜ
}
u16 Get_Adc(u8 ch)
{
//ÉèÖÃÖ¸¶¨ADCµÄ¹æÔò×éͨµÀ£¬Ò»¸öÐòÁУ¬²ÉÑùʱ¼ä
ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 ); //ADC1,ADCͨµÀ,²ÉÑùʱ¼äΪ239.5ÖÜÆÚ
ADC_SoftwareStartConvCmd(ADC1, ENABLE); //ʹÄÜÖ¸¶¨µÄADC1µÄÈí¼þת»»Æô¶¯¹¦ÄÜ
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//µÈ´ýת»»½áÊø
return ADC_GetConversionValue(ADC1); //·µ»Ø×î½üÒ»´ÎADC1¹æÔò×éµÄת»»½á¹û
}
u16 Get_Adc_Average(u8 ch,u8 times)
{
u32 temp_val=0;
u8 t;
for(t=0;t<times;t++)
{
temp_val+=Get_Adc(ch);
delay_ms(5);
}
return temp_val/times;
}
void Adc2_Init(void)
{
ADC_InitTypeDef ADC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC2 , ENABLE ); //ʹÄÜADC1ͨµÀʱÖÓ
RCC_ADCCLKConfig(RCC_PCLK2_Div6); //ÉèÖÃADC·ÖƵÒò×Ó6 72M/6=12,ADC×î´óʱ¼ä²»Äܳ¬¹ý14M
//PA1 ×÷ΪģÄâͨµÀÊäÈëÒý½Å
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //Ä£ÄâÊäÈëÒý½Å
GPIO_Init(GPIOA, &GPIO_InitStructure);
ADC_DeInit(ADC2); //¸´Î»ADC1,½«ÍâÉè ADC1 µÄÈ«²¿¼Ä´æÆ÷ÖØÉèΪȱʡֵ
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //ADC¹¤×÷ģʽ:ADC1ºÍADC2¹¤×÷ÔÚ¶ÀÁ¢Ä£Ê½
ADC_InitStructure.ADC_ScanConvMode = DISABLE; //Ä£Êýת»»¹¤×÷ÔÚµ¥Í¨µÀģʽ
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; //Ä£Êýת»»¹¤×÷ÔÚµ¥´Îת»»Ä£Ê½
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //ת»»ÓÉÈí¼þ¶ø²»ÊÇÍⲿ´¥·¢Æô¶¯
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //ADCÊý¾ÝÓÒ¶ÔÆë
ADC_InitStructure.ADC_NbrOfChannel = 1; //˳Ðò½øÐйæÔòת»»µÄADCͨµÀµÄÊýÄ¿
ADC_Init(ADC1, &ADC_InitStructure); //¸ù¾ÝADC_InitStructÖÐÖ¸¶¨µÄ²ÎÊý³õʼ»¯ÍâÉèADCxµÄ¼Ä´æÆ÷
ADC_Cmd(ADC2, ENABLE); //ʹÄÜÖ¸¶¨µÄADC2
ADC_ResetCalibration(ADC2); //ʹÄܸ´Î»Ð£×¼
while(ADC_GetResetCalibrationStatus(ADC2)); //µÈ´ý¸´Î»Ð£×¼½áÊø
ADC_StartCalibration(ADC2); //¿ªÆôADУ׼
while(ADC_GetCalibrationStatus(ADC2)); //µÈ´ýУ׼½áÊø
ADC_SoftwareStartConvCmd(ADC2, ENABLE); //ʹÄÜÖ¸¶¨µÄADC1µÄÈí¼þת»»Æô¶¯¹¦ÄÜ
}
u16 Get_Adc2(u8 ch)
{
//ÉèÖÃÖ¸¶¨ADCµÄ¹æÔò×éͨµÀ£¬Ò»¸öÐòÁУ¬²ÉÑùʱ¼ä
ADC_RegularChannelConfig(ADC2, ch, 1, ADC_SampleTime_239Cycles5 ); //ADC1,ADCͨµÀ,²ÉÑùʱ¼äΪ239.5ÖÜÆÚ
ADC_SoftwareStartConvCmd(ADC2, ENABLE); //ʹÄÜÖ¸¶¨µÄADC2µÄÈí¼þת»»Æô¶¯¹¦ÄÜ
while(!ADC_GetFlagStatus(ADC2, ADC_FLAG_EOC ));//µÈ´ýת»»½áÊø
return ADC_GetConversionValue(ADC2); //·µ»Ø×î½üÒ»´ÎADC1¹æÔò×éµÄת»»½á¹û
}
u16 Get_Adc2_Average(u8 ch,u8 times)
{
u32 temp_val=0;
u8 t;
for(t=0;t<times;t++)
{
temp_val+=Get_Adc2(ch);
delay_ms(5);
}
return temp_val/times;
}
void TIM4_IRQHandler(void) //TIM4ÖжÏ
{//extern float temp,adcx,adcy,Target_voltage;
int temp=0;
u8 buf[8]; // ?????????????
Target_voltage=0.96;
if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET) //¼ì²éÖ¸¶¨µÄTIMÖжϷ¢ÉúÓë·ñ:TIM ÖжÏÔ´
{
TIM_ClearITPendingBit(TIM4, TIM_IT_Update ); //Çå³ýTIMxµÄÖжϴý´¦Àíλ:TIM ÖжÏÔ´
adcx=Get_Adc_Average(ADC_Channel_1,33);//0-4096}
adcs=Target_voltage*(4096/3.3);
temp=Voltage_PID(adcx, adcs);
TIM_SetCompare3(TIM3,temp);
delay_ms(20);
//sprintf((char*)adcx," %8ld ",fre_data);
LCD_ShowxNum(156,130,adcx,4,16,0); //ÏÔʾadc
adca=(float)adcx*(3.3/4096);
adcx=adca;
LCD_ShowxNum(156,150,adca,1,16,0);//ÏÔʾµçѹֵ
adca-=adcx;
adca*=1000;
LCD_ShowxNum(172,150,adca,3,16,0X80);//µçѹֵСÊý
LCD_ShowxNum(156,170,adcz,4,16,0);//ÏÔʾADCµÄÖµ
adcl=Get_Adc2_Average(ADC_Channel_4,33);//0-4096}
//delay_ms(20);
LCD_ShowxNum(156,90,adcl,4,16,0); //ÏÔʾadcl
adcL=(float)adcl*(3.3/4096);
adcl=adcL;
LCD_ShowxNum(156,110,adcL,1,16,0);//ÏÔʾµçѹֵ
adcL-=adcl;
adcL*=1000;
LCD_ShowxNum(172,110,adcL,3,16,0X80);//µçѹֵСÊý
//LCD_ShowxNum(156,170,Pwm,4,16,0);//ÏÔʾADCµÄÖµ
adcz=temp;
LCD_ShowxNum(156,210,temp,4,16,0);//pwm
/*temp-=adcz;
temp*=1000;
LCD_ShowxNum(172,210,temp,3,16,0X80);//pwmС*/
adcy=Target_voltage;
LCD_ShowxNum(156,230,Target_voltage,1,16,0);//
Target_voltage-=adcy;
Target_voltage*=1000;
LCD_ShowxNum(172,230,Target_voltage,3,16,0X80);
}
}
|
-
第一次正常
-
引入第二路ad后乱码
|