野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 15403|回复: 4

【求助】在μC/OSIII的例程里加入ADC,串口浮点数输出不正确

[复制链接]
发表于 2017-3-30 11:28:08 | 显示全部楼层 |阅读模式
本帖最后由 contemplator 于 2017-3-30 11:30 编辑

搞了三天了都没有头绪,求大神帮助,使用的是野火V2开发板
在μC/OSIII的例程里加入ADC(操作系统+ADC+串口),串口浮点数输出不正确;
没加入ADC时(操作系统+串口)一切正常,
ADC的库函数工程(ADC+串口)也一切正常
以下是任务函数:
  1. static  void  AppTaskLed1 ( void * p_arg )
  2. {
  3.     OS_ERR      err;
  4.                 __IO uint16_t i,j,k,middle,x=96,y=10;
  5.                 float  total1,total2,After_filter[10],ceshi1=1.234678;//′æ·ÅÔËËãoóμÄ16½øÖÆμçÑ1Öμ
  6.    (void)p_arg;

  7. /*Task body, always written as an infinite loop. */
  8.     while (DEF_TRUE) {            
  9.                         /*macLED1_TOGGLE ();
  10.                         OSTimeDly ( 1000, OS_OPT_TIME_DLY, & err ); */
  11.                 ADC_SoftwareStartConvCmd(ADC1, ENABLE);
  12.                 OSTimeDlyHMSM(0, 0,0,100,OS_OPT_TIME_HMSM_STRICT,&err);
  13.                 ADC_SoftwareStartConvCmd(ADC1, DISABLE);
  14.                 //count(96,10,&ADC_Conver[0][0]);
  15.                         for(j=0;j<y;j++)
  16.                         {
  17.                                         if(j<y-2)//&#188;&#198;&#203;&#227;&#199;°n-2áDμ&#196;&#213;&#230;óDD§&#214;μ
  18.                                         {
  19.                                                         total1=0;//′&#230;·&#197;&#190;ù·&#189;&#184;ù&#214;μ
  20.                                                         total2=0;//′&#230;·&#197;&#198;&#189;&#190;ù&#214;μ
  21.                                                         for(i=0;i<x;i++)
  22.                                                         {        middle=ADC_Conver[i][j];
  23.                                                                 total1=total1+middle*middle;
  24.                                                                 total2=total2+middle;
  25.                                                         }
  26.                                                                 After_filter[j]=sqrt(total1/x-(total2/x)*(total2/x));//&#188;&#198;&#203;&#227;&#213;&#230;óDD§&#214;μ
  27.                                         }
  28.                                         if(j==y-2)//&#188;&#198;&#203;&#227;μún-1áDμ&#196;&#198;&#189;&#190;ù&#214;μ
  29.                                         {
  30.                                                         total2=0;//′&#230;·&#197;&#198;&#189;&#190;ù&#214;μ
  31.                                                         for(i=0;i<x;i++)
  32.                                                         {        middle=ADC_Conver[i][j];
  33.                                                                 total2=total2+middle;
  34.                                                         }
  35.                                                         After_filter[j]=total2/x;
  36.                                         }
  37.                                         if(j==y-1)//×&#238;oóò&#187;áD£&#172;&#199;ó&#198;&#189;&#190;ù&#214;μ
  38.                                         {
  39.                                                         total2=0;//′&#230;·&#197;&#198;&#189;&#190;ù&#214;μ                                                        
  40.                                                         for(i=0;i<x;i++)
  41.                                                         {
  42.                                                                 middle=ADC_Conver[i][j];
  43.                                                                 total2=total2+middle;
  44.                                                         }
  45.                                                                 After_filter[j]=total2/x;
  46.                                          }
  47.                                        
  48.                         }
  49.                                                 //&#189;&#171;&#188;&#198;&#203;&#227;&#189;á1&#251;×a&#187;ˉ&#206;aêμ&#188;ê&#214;μ
  50.                                 for(k=0;k<y;k++)
  51.                         {
  52.                                                          ADC_Value[k]=After_filter[k]/4096*3.3;
  53.                         }                                                        

  54.                 //ADC_ConvertedValueLocal =(float) ADC_ConvertedValue/4096*3.3; // ?????AD?
  55.                 for(j=0;j<10;j++)
  56.                 {        printf("\r\n ADC_ConvertedValue[%d] = %d\r\n",j,ADC_Conver[50][j]);
  57.                         printf("\r\n ADC_ConvertedValueLocal[%d] = %f V \r\n",j, ADC_Value[j]);
  58.                         printf("\r\n ceishi1,yaoshihaibudui,qnmd = %f V \r\n", ceshi1);
  59.                 }
  60.                 OSTimeDlyHMSM(0, 0,0,200,OS_OPT_TIME_HMSM_STRICT,&err);
  61.                
  62.     }
  63.         
  64. }
复制代码

以下是ADC配置:

  1. /*************D&#197;o&#197;2é&#188;ˉoˉêy*******************/
  2. /*
  3. **oˉêy1|&#196;ü:ADCD&#197;o&#197;μ&#196;2é&#188;ˉoí′|àí
  4. **&#184;÷D&#197;o&#197;í¨μà:
  5. **      
  6. **    1ü&#189;&#197;     í¨μà             D&#197;o&#197;
  7. **    PA1   ADC123_IN1      Vol_A     A&#207;àμ&#231;&#209;1              
  8. **    PA2   ADC123_IN2      Vol_B     B&#207;àμ&#231;&#209;1      
  9. **    PA3   ADC123_IN3      Vol_C     C&#207;àμ&#231;&#209;1
  10. **    PB1   ADC123_IN9                á&#227;Dòμ&#231;&#209;1
  11. **    PC0   ADC123_IN10     Cir_A     A&#207;àμ&#231;á÷   
  12. **    PC1   ADC123_IN11     Cir_B     B&#207;àμ&#231;á÷     
  13. **    PC2   ADC123_IN12     Cir_C     C&#207;àμ&#231;á÷
  14. **    PC3   ADC123_IN13               á&#227;Dòμ&#231;á÷
  15. **    PC4   ADC12 _IN14               &#214;±á÷μ&#231;á÷&#214;μ
  16. **    PC5   ADC12 _IN15
  17. **                             
  18. **                        
  19. ***********/   
  20. #include "adc.h"
  21. #include "Usart.h"
  22. #include "math.h"
  23. //oê&#182;¨ò&#229;
  24. // #define N 95// &#195;&#191;&#184;&#246;í¨μà&#190;ù·&#214;μ&#196;·Yêy
  25. // #define M 10 //í¨μàêy
  26. #define ADC1_DR_Address  ((u32)0x40012400+0x4c)
  27. //2é&#188;ˉêy&#190;Y′&#230;·&#197;μ&#196;êy×é
  28. __IO uint16_t ADC_Conver[96][10];//uint16_t ADC_Conver[96][10];

  29. //float  ADC_Value[10];//&#188;&#198;&#203;&#227;μ&#196;ê&#174;&#189;&#248;&#214;&#198;μ&#196;μ&#231;&#209;1&#214;μ

  30. /*
  31. * oˉêy&#195;&#251;:ADC1_GPIO_Config
  32. * 1|&#196;ü  :&#197;&#228;&#214;&#195;ADC1μ&#196;DMA1′&#171;ê&#228;,&#191;a&#198;&#244;&#207;àó|μ&#196;IO&#191;ú
  33. * ê&#228;è&#235;  : &#206;T
  34. * ê&#228;3&#246;  : &#206;T
  35. * μ÷ó&#195;  :&#196;ú2&#191;μ÷ó&#195;
  36. */
  37. static void ADC1_GPIO_Ceshi_Config(void)
  38. {
  39.         GPIO_InitTypeDef GPIO_InitStructure;
  40.         /* Enable DMA clock */
  41.         RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
  42.         /* Enable ADC1 and GPIOC clock */
  43.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOA| RCC_APB2Periph_GPIOB| RCC_APB2Periph_GPIOC, ENABLE);        
  44.         /* Configure PA1/PA2/PA3  as analog input */
  45.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;
  46.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
  47.         GPIO_Init(GPIOA, &GPIO_InitStructure);
  48.         //PB1&#197;&#228;&#214;&#195;&#206;a&#196;£&#196;aê&#228;è&#235;&#196;£ê&#189;
  49.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
  50.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
  51.         GPIO_Init(GPIOB, &GPIO_InitStructure);
  52.         //&#197;&#228;&#214;&#195;PC0-PC5&#206;a&#196;£&#196;aê&#228;è&#235;&#196;£ê&#189;
  53.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5;
  54.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
  55.         GPIO_Init(GPIOC, &GPIO_InitStructure);
  56. }


  57. /* oˉêy&#195;&#251;:ADC1_Mode_Config
  58. * 1|&#196;ü  :&#191;a&#198;&#244;ADC1μ&#196;DMA′&#171;ê&#228;
  59. * ê&#228;è&#235;  : &#161;&#161;&#206;T
  60. * ê&#228;3&#246;  :&#206;T
  61. * μ÷ó&#195;  :&#196;ú2&#191;μ÷ó&#195;
  62. */
  63. static void ADC1_Mode_Ceshi_Config(void)
  64. {
  65.                 DMA_InitTypeDef DMA_InitStructure;
  66.                 ADC_InitTypeDef ADC_InitStructure;
  67.                
  68.                 /* DMA channel1 configuration */
  69.                 DMA_DeInit(DMA1_Channel1);
  70.                 DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;         //ADC&#212;′μ&#216;&#214;·
  71.                 DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADC_Conver;//êy&#190;Y×a&#187;&#187;oóμ&#196;′&#230;·&#197;μ&#216;&#214;·
  72.                 DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
  73.                 DMA_InitStructure.DMA_BufferSize =960 ;
  74.                 DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//íaéè&#212;&#246;3¤&#196;£ê&#189;1&#216;±&#213;
  75.                 DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;  //′&#230;êy&#199;&#248;&#212;&#246;3¤&#196;£ê&#189;ê1&#196;ü
  76.                 DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;        //°&#235;&#184;&#246;×&#214;&#189;úêy&#190;Y′&#171;ê&#228;
  77.                 DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
  78.                 DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;                //&#191;a&#198;&#244;DMA&#209;-&#187;·&#196;£ê&#189;
  79.                 DMA_InitStructure.DMA_Priority = DMA_Priority_High;
  80.                 DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
  81.                 DMA_Init(DMA1_Channel1, &DMA_InitStructure);
  82.         
  83.                 /* ADC1 configuration */
  84.                 ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;        //&#197;&#228;&#214;&#195;ADC&#206;a&#182;àá¢&#196;£ê&#189;
  85.                 ADC_InitStructure.ADC_ScanConvMode = ENABLE ;          //ê1ó&#195;&#182;à&#184;&#246;í¨μà2é&#188;ˉ£&#172;ê1&#196;üé¨&#195;è&#196;£ê&#189;
  86.                 ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;        //Dèòa&#182;&#212;&#182;à&#184;&#246;í¨μà&#189;&#248;DDá&#172;D&#248;2é&#188;ˉêy&#190;Y,&#191;a&#198;&#244;ADCμ&#196;á&#172;D&#248;×a&#187;&#187;&#196;£ê&#189;
  87.                 ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;        //&#212;ú×a&#187;&#187;ê&#199;ê1ó&#195;èí&#188;t′¥·¢
  88.                 ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;         //2é&#188;ˉêy&#190;Yóò&#182;&#212;&#198;&#235;
  89.                 ADC_InitStructure.ADC_NbrOfChannel = 10;                 //2é&#209;ùμ&#196;í¨μàêy10
  90.                 ADC_Init(ADC1, &ADC_InitStructure);
  91.                 /*?&#197;&#228;&#214;&#195;ADCê±&#214;ó,&#206;aPCLK2μ&#196;6·&#214;&#198;μ,&#188;′12MHz*/
  92.                 RCC_ADCCLKConfig(RCC_PCLK2_Div6);

  93.     /*&#197;&#228;&#214;&#195;ADC1&#184;&#246;í¨μà2é&#209;ù&#214;ü&#198;ú&#206;a237.5.        5&#184;&#246;&#214;ü&#198;ú, */
  94.                 ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_239Cycles5);
  95.                 ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 2, ADC_SampleTime_239Cycles5);
  96.                 ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 3, ADC_SampleTime_239Cycles5);
  97.                 ADC_RegularChannelConfig(ADC1, ADC_Channel_9, 4, ADC_SampleTime_239Cycles5);
  98.                 ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 5, ADC_SampleTime_239Cycles5);
  99.                 ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 6, ADC_SampleTime_239Cycles5);
  100.                 ADC_RegularChannelConfig(ADC1, ADC_Channel_12, 7, ADC_SampleTime_239Cycles5);
  101.                 ADC_RegularChannelConfig(ADC1, ADC_Channel_13, 8, ADC_SampleTime_239Cycles5);
  102.                 ADC_RegularChannelConfig(ADC1, ADC_Channel_14, 9, ADC_SampleTime_239Cycles5);
  103.                 ADC_RegularChannelConfig(ADC1, ADC_Channel_15, 10, ADC_SampleTime_239Cycles5);        
  104.                 /* Enable ADC1 DMA */
  105.                 ADC_DMACmd(ADC1, ENABLE);
  106.                 /* Enable ADC1 */
  107.                 ADC_Cmd(ADC1, ENABLE);
  108.                 /*&#214;&#216;&#214;&#195;ADCμ&#196;D£&#209;é&#206;&#187; */   
  109.                 ADC_ResetCalibration(ADC1);
  110.                 /*μè′yADCD£&#209;é&#191;a&#198;&#244; */
  111.                 while(ADC_GetResetCalibrationStatus(ADC1));
  112.                 /* ADCD£&#209;é */
  113.                 ADC_StartCalibration(ADC1);
  114.                 /* μè′yADCD£&#209;é&#189;áê&#248;*/
  115.                 while(ADC_GetCalibrationStatus(ADC1));
  116.                 /* &#198;&#244;&#182;ˉADCD£&#209;é */
  117.                 DMA_Cmd(DMA1_Channel1, ENABLE);
  118. //                 ADC_SoftwareStartConvCmd(ADC1, ENABLE);
  119. }

  120. /*
  121. * oˉêy&#195;&#251;:ADC1_Init
  122. * ê&#228;è&#235;  :&#206;T
  123. * ê&#228;3&#246;  :&#206;T
  124. * ·μ&#187;&#216;  :&#206;T
  125. * μ÷ó&#195;  :ía2&#191;μ÷ó&#195;
  126. */
  127. void ADC1_Ceshi_Init(void)
  128. {
  129.         ADC1_GPIO_Ceshi_Config();
  130.         ADC1_Mode_Ceshi_Config();
  131. }
复制代码




搜狗截图20170330113016.png

2. 多任务(切换三个 LED).rar

6.22 MB, 下载次数: 31

回复

使用道具 举报

发表于 2017-3-30 13:55:19 | 显示全部楼层
ucosiii使用浮点运算单元的时候,启动文件要有专门的修改的,可以看看野火F4的ucos例程
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-3-30 14:16:50 | 显示全部楼层
随风 发表于 2017-3-30 13:55
ucosiii使用浮点运算单元的时候,启动文件要有专门的修改的,可以看看野火F4的ucos例程

我这里用得是野火F103的V2开发板
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-3-30 14:52:27 | 显示全部楼层
随风 发表于 2017-3-30 13:55
ucosiii使用浮点运算单元的时候,启动文件要有专门的修改的,可以看看野火F4的ucos例程

解决了,就是8字节对齐,谢谢了!
__align(8) static OS_STK TaskStartStk[TASK_START_STK_SIZE];如果你没有修改过arm的启动代码可能就会出现这个问题
回复 支持 反对

使用道具 举报

发表于 2017-3-30 16:20:52 | 显示全部楼层
contemplator 发表于 2017-3-30 14:52
解决了,就是8字节对齐,谢谢了!
__align(8) static OS_STK TaskStartStk[TASK_START_STK_SIZE];如果你 ...

不错不错
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2025-1-15 18:24 , Processed in 0.041580 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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