OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2208|回复: 2

单路ad正常,引入多路ad后程序紊乱,LCD显示无意义数字

[复制链接]

1

主题

3

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2018-7-5
在线时间
4 小时
发表于 2018-7-5 18:19:59 | 显示全部楼层 |阅读模式
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 );   //&Ecirc;&sup1;&Auml;&Uuml;ADC1&Iacute;¨&micro;&Agrave;&Ecirc;±&Ouml;&Oacute;

RCC_ADCCLKConfig(RCC_PCLK2_Div6);   //&Eacute;è&Ouml;&Atilde;ADC·&Ouml;&AElig;&micro;&Ograve;ò×&Oacute;6 72M/6=12,ADC×&icirc;&acute;ó&Ecirc;±&frac14;&auml;&sup2;&raquo;&Auml;&Uuml;&sup3;&not;&sup1;&yacute;14M
//PA1 ×÷&Icirc;&ordf;&Auml;&pound;&Auml;&acirc;&Iacute;¨&micro;&Agrave;&Ecirc;&auml;&Egrave;&euml;&Ograve;&yacute;&frac12;&Aring;                        
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;  //&Auml;&pound;&Auml;&acirc;&Ecirc;&auml;&Egrave;&euml;&Ograve;&yacute;&frac12;&Aring;
GPIO_Init(GPIOA, &GPIO_InitStructure);
ADC_DeInit(ADC2);  //&cedil;&acute;&Icirc;&raquo;ADC1,&frac12;&laquo;&Iacute;&acirc;&Eacute;è ADC1 &micro;&Auml;&Egrave;&laquo;&sup2;&iquest;&frac14;&Auml;&acute;&aelig;&AElig;÷&Ouml;&Oslash;&Eacute;è&Icirc;&ordf;&Egrave;±&Ecirc;&iexcl;&Ouml;&micro;
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //ADC&sup1;¤×÷&Auml;&pound;&Ecirc;&frac12;:ADC1&ordm;&Iacute;ADC2&sup1;¤×÷&Ocirc;&Uacute;&para;&Agrave;&Aacute;&cent;&Auml;&pound;&Ecirc;&frac12;
ADC_InitStructure.ADC_ScanConvMode = DISABLE; //&Auml;&pound;&Ecirc;&yacute;×&ordf;&raquo;&raquo;&sup1;¤×÷&Ocirc;&Uacute;&micro;&yen;&Iacute;¨&micro;&Agrave;&Auml;&pound;&Ecirc;&frac12;
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; //&Auml;&pound;&Ecirc;&yacute;×&ordf;&raquo;&raquo;&sup1;¤×÷&Ocirc;&Uacute;&micro;&yen;&acute;&Icirc;×&ordf;&raquo;&raquo;&Auml;&pound;&Ecirc;&frac12;
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //×&ordf;&raquo;&raquo;&Oacute;&Eacute;&Egrave;í&frac14;&thorn;&para;&oslash;&sup2;&raquo;&Ecirc;&Ccedil;&Iacute;&acirc;&sup2;&iquest;&acute;&yen;·&cent;&AElig;&ocirc;&para;&macr;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //ADC&Ecirc;&yacute;&frac34;&Yacute;&Oacute;&Ograve;&para;&Ocirc;&AElig;&euml;
ADC_InitStructure.ADC_NbrOfChannel = 1; //&Euml;&sup3;&ETH;ò&frac12;&oslash;&ETH;&ETH;&sup1;&aelig;&Ocirc;ò×&ordf;&raquo;&raquo;&micro;&Auml;ADC&Iacute;¨&micro;&Agrave;&micro;&Auml;&Ecirc;&yacute;&Auml;&iquest;
ADC_Init(ADC1, &ADC_InitStructure); //&cedil;ù&frac34;&Yacute;ADC_InitStruct&Ouml;&ETH;&Ouml;&cedil;&para;¨&micro;&Auml;&sup2;&Icirc;&Ecirc;&yacute;&sup3;&otilde;&Ecirc;&frac14;&raquo;&macr;&Iacute;&acirc;&Eacute;èADCx&micro;&Auml;&frac14;&Auml;&acute;&aelig;&AElig;÷   
  
ADC_Cmd(ADC2, ENABLE); //&Ecirc;&sup1;&Auml;&Uuml;&Ouml;&cedil;&para;¨&micro;&Auml;ADC2

ADC_ResetCalibration(ADC2); //&Ecirc;&sup1;&Auml;&Uuml;&cedil;&acute;&Icirc;&raquo;&ETH;&pound;×&frac14;  
  
while(ADC_GetResetCalibrationStatus(ADC2)); //&micro;&Egrave;&acute;&yacute;&cedil;&acute;&Icirc;&raquo;&ETH;&pound;×&frac14;&frac12;á&Ecirc;&oslash;

ADC_StartCalibration(ADC2);  //&iquest;&ordf;&AElig;&ocirc;AD&ETH;&pound;×&frac14;

while(ADC_GetCalibrationStatus(ADC2));  //&micro;&Egrave;&acute;&yacute;&ETH;&pound;×&frac14;&frac12;á&Ecirc;&oslash;

ADC_SoftwareStartConvCmd(ADC2, ENABLE);  //&Ecirc;&sup1;&Auml;&Uuml;&Ouml;&cedil;&para;¨&micro;&Auml;ADC1&micro;&Auml;&Egrave;í&frac14;&thorn;×&ordf;&raquo;&raquo;&AElig;&ocirc;&para;&macr;&sup1;&brvbar;&Auml;&Uuml;
}      

u16 Get_Adc2(u8 ch)   
{
   //&Eacute;è&Ouml;&Atilde;&Ouml;&cedil;&para;¨ADC&micro;&Auml;&sup1;&aelig;&Ocirc;ò×é&Iacute;¨&micro;&Agrave;&pound;&not;&Ograve;&raquo;&cedil;&ouml;&ETH;ò&Aacute;&ETH;&pound;&not;&sup2;&Eacute;&Ntilde;ù&Ecirc;±&frac14;&auml;
ADC_RegularChannelConfig(ADC2, ch, 1, ADC_SampleTime_239Cycles5 ); //ADC1,ADC&Iacute;¨&micro;&Agrave;,&sup2;&Eacute;&Ntilde;ù&Ecirc;±&frac14;&auml;&Icirc;&ordf;239.5&Ouml;&Uuml;&AElig;&Uacute;         
  
ADC_SoftwareStartConvCmd(ADC2, ENABLE);  //&Ecirc;&sup1;&Auml;&Uuml;&Ouml;&cedil;&para;¨&micro;&Auml;ADC2&micro;&Auml;&Egrave;í&frac14;&thorn;×&ordf;&raquo;&raquo;&AElig;&ocirc;&para;&macr;&sup1;&brvbar;&Auml;&Uuml;
  
while(!ADC_GetFlagStatus(ADC2, ADC_FLAG_EOC ));//&micro;&Egrave;&acute;&yacute;×&ordf;&raquo;&raquo;&frac12;á&Ecirc;&oslash;
return ADC_GetConversionValue(ADC2); //·&micro;&raquo;&Oslash;×&icirc;&frac12;ü&Ograve;&raquo;&acute;&Icirc;ADC1&sup1;&aelig;&Ocirc;ò×é&micro;&Auml;×&ordf;&raquo;&raquo;&frac12;á&sup1;&ucirc;
}

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&Ouml;&ETH;&para;&Iuml;
{//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) //&frac14;ì&sup2;é&Ouml;&cedil;&para;¨&micro;&Auml;TIM&Ouml;&ETH;&para;&Iuml;·&cent;&Eacute;ú&Oacute;&euml;·&ntilde;:TIM &Ouml;&ETH;&para;&Iuml;&Ocirc;&acute;
  {
  TIM_ClearITPendingBit(TIM4, TIM_IT_Update  );  //&Ccedil;&aring;&sup3;&yacute;TIMx&micro;&Auml;&Ouml;&ETH;&para;&Iuml;&acute;&yacute;&acute;&brvbar;&Agrave;í&Icirc;&raquo;:TIM &Ouml;&ETH;&para;&Iuml;&Ocirc;&acute;
  
  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); //&Iuml;&Ocirc;&Ecirc;&frac34;adc
  adca=(float)adcx*(3.3/4096);
   adcx=adca;
   LCD_ShowxNum(156,150,adca,1,16,0);//&Iuml;&Ocirc;&Ecirc;&frac34;&micro;&ccedil;&Ntilde;&sup1;&Ouml;&micro;
   adca-=adcx;
  adca*=1000;
  LCD_ShowxNum(172,150,adca,3,16,0X80);//&micro;&ccedil;&Ntilde;&sup1;&Ouml;&micro;&ETH;&iexcl;&Ecirc;&yacute;
  LCD_ShowxNum(156,170,adcz,4,16,0);//&Iuml;&Ocirc;&Ecirc;&frac34;ADC&micro;&Auml;&Ouml;&micro;
   adcl=Get_Adc2_Average(ADC_Channel_4,33);//0-4096}
   //delay_ms(20);
  
   LCD_ShowxNum(156,90,adcl,4,16,0); //&Iuml;&Ocirc;&Ecirc;&frac34;adcl
  adcL=(float)adcl*(3.3/4096);
   adcl=adcL;
   LCD_ShowxNum(156,110,adcL,1,16,0);//&Iuml;&Ocirc;&Ecirc;&frac34;&micro;&ccedil;&Ntilde;&sup1;&Ouml;&micro;
   adcL-=adcl;
  adcL*=1000;
  LCD_ShowxNum(172,110,adcL,3,16,0X80);//&micro;&ccedil;&Ntilde;&sup1;&Ouml;&micro;&ETH;&iexcl;&Ecirc;&yacute;
  //LCD_ShowxNum(156,170,Pwm,4,16,0);//&Iuml;&Ocirc;&Ecirc;&frac34;ADC&micro;&Auml;&Ouml;&micro;
   
   adcz=temp;
   LCD_ShowxNum(156,210,temp,4,16,0);//pwm
   /*temp-=adcz;
   temp*=1000;
   LCD_ShowxNum(172,210,temp,3,16,0X80);//pwm&ETH;&iexcl;*/
   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后乱码

引入第二路ad后乱码
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

3

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2018-7-5
在线时间
4 小时
 楼主| 发表于 2018-7-5 18:29:52 | 显示全部楼层
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); //&Ecirc;&sup1;
ADC_ResetCalibration(ADC1); //&Ecirc;&sup1;
while(ADC_GetResetCalibrationStatus(ADC1));
ADC_StartCalibration(ADC1);  
while(ADC_GetCalibrationStatus(ADC1));  
ADC_SoftwareStartConvCmd(ADC1, ENABLE);  //&Ecirc;&sup1;
}      

u16 Get_Adc(u8 ch)   
{
   ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 );           
  
ADC_SoftwareStartConvCmd(ADC1, ENABLE);  
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));
return ADC_GetConversionValue(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 );  
RCC_ADCCLKConfig(RCC_PCLK2_Div6);                        
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;  
GPIO_Init(GPIOA, &GPIO_InitStructure);
ADC_DeInit(ADC2);  
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(ADC2, ENABLE);

ADC_ResetCalibration(ADC2);
  
while(ADC_GetResetCalibrationStatus(ADC2));
ADC_StartCalibration(ADC2);  
while(ADC_GetCalibrationStatus(ADC2));
ADC_SoftwareStartConvCmd(ADC2, ENABLE);
}      

u16 Get_Adc2(u8 ch)   
{
   ADC_RegularChannelConfig(ADC2, ch, 1, ADC_SampleTime_239Cycles5 );      
  
ADC_SoftwareStartConvCmd(ADC2, ENABLE);   
while(!ADC_GetFlagStatus(ADC2, ADC_FLAG_EOC ));
return ADC_GetConversionValue(ADC2); }

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&Ouml;&ETH;&para;&Iuml;
{  int temp=0;

Target_voltage=0.96;
if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET)
  {
  TIM_ClearITPendingBit(TIM4, TIM_IT_Update  );   
  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);
  
  LCD_ShowxNum(156,130,adcx,4,16,0);
  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);
   adcl=Get_Adc2_Average(ADC_Channel_4,33);//0-4096}
  
  
   LCD_ShowxNum(156,90,adcl,4,16,0);
  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);//
  
   
   adcz=temp;
   LCD_ShowxNum(156,210,temp,4,16,0);//pwm
   /*temp-=adcz;
   temp*=1000;
   LCD_ShowxNum(172,210,temp,3,16,0X80);//pwm&ETH;&iexcl;*/
   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);
  }
}
回复

使用道具 举报

1

主题

3

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2018-7-5
在线时间
4 小时
 楼主| 发表于 2018-7-5 18:30:33 | 显示全部楼层
前面程序乱码太难看,发了一个整洁版的
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-15 13:20

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表