STM8G-学习 发表于 2024-12-30 13:05:53

8G1K08-38I-QFN20芯片编程求平均值,数据不对。

您好:我本来打算将采样的5个值,去掉一个最高一个最低,剩下三个求平均,后来发现数据都是0,然后用2个值求平均,后来发现,求和后值也不对,求平均后更不对,不知道为什么,帮我看看吧?



#include      "config.h"
//#include      "STC8G_PCA.h"
#include      "STC8G_H_GPIO.h"
#include      "STC8G_H_UART.h"
#include      "STC8G_H_NVIC.h"
#include      "STC8G_H_Delay.h"
#include      "STC8G_H_Switch.h"
#include      "STC8G_H_Timer.h"

/*************   功能说明   ***************

本例程基于STC8G1K08-20PIN进行编写测试,STC8G系列芯片可通用参考.

/******************** IO口配置 ********************/
void      GPIO_config(void)
{
      GPIO_InitTypeDef      GPIO_InitStructure;                              //结构定义

      GPIO_InitStructure.Pin= GPIO_Pin_All;                        //指定要初始化的IO, GPIO_Pin_0 ~ GPIO_Pin_7, 或操作
      GPIO_InitStructure.Mode = GPIO_PullUp;                        //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
      GPIO_Inilize(GPIO_P1,&GPIO_InitStructure);      //初始化
   
      GPIO_InitStructure.Pin= GPIO_Pin_2;                        //指定要初始化的IO, GPIO_Pin_0 ~ GPIO_Pin_7, 或操作
      GPIO_InitStructure.Mode = GPIO_OUT_PP;                        //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
      GPIO_Inilize(GPIO_P1,&GPIO_InitStructure);      //初始化

      GPIO_InitStructure.Pin= GPIO_Pin_7;                              //指定要初始化的IO, GPIO_Pin_0 ~ GPIO_Pin_7, 或操作
      GPIO_InitStructure.Mode = GPIO_OUT_PP;                        //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
      GPIO_Inilize(GPIO_P3,&GPIO_InitStructure);      //初始化
    GPIO_InitStructure.Pin= GPIO_Pin_6|GPIO_Pin_5|GPIO_Pin_4|GPIO_Pin_3;                              //指定要初始化的IO, GPIO_Pin_0 ~ GPIO_Pin_7, 或操作
      GPIO_InitStructure.Mode = GPIO_HighZ;                        //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
      GPIO_Inilize(GPIO_P3,&GPIO_InitStructure);      //初始化
}

/***************串口初始化函数 *****************/
void      UART_config(void)
{
      COMx_InitDefine                COMx_InitStructure;                                        //结构定义

      COMx_InitStructure.UART_Mode      = UART_8bit_BRTx;      //模式, UART_ShiftRight,UART_8bit_BRTx,UART_9bit,UART_9bit_BRTx
//      COMx_InitStructure.UART_BRT_Use   = BRT_Timer2;                        //选择波特率发生器, BRT_Timer1, BRT_Timer2 (注意: 串口2固定使用BRT_Timer2)
      COMx_InitStructure.UART_BaudRate= 115200;                        //波特率, 一般 110 ~ 115200
      COMx_InitStructure.UART_RxEnable= ENABLE;                              //接收允许,   ENABLE或DISABLE
      COMx_InitStructure.BaudRateDouble = DISABLE;                        //波特率加倍, ENABLE或DISABLE
      UART_Configuration(UART2, &COMx_InitStructure);                //初始化串口1 UART1,UART2,UART3,UART4
      NVIC_UART2_Init(ENABLE,Priority_3);                //中断使能, ENABLE/DISABLE; 优先级(低到高) Priority_0,Priority_1,Priority_2,Priority_3

      UART2_SW(UART2_SW_P10_P11);                //UART1_SW_P30_P31,UART1_SW_P36_P37,UART1_SW_P16_P17,UART1_SW_P43_P44
}

void      Timer1_config(void)
{
    TMOD =0x00;
    TL1 = 0XCD;                                 //65536-11.0592M/12/1000 FC669221843F8CD
    TH1 = 0XF8;
    TR1 = 1;                                    //启动定时器
    ET1 = 1;                                    //使能定时器中断
    IPH=IPH|PT1H;
    PT1 =1;
}


void Timer0_config(void)
{
    TMOD=0x05;                              //外部计数模式,不自动重载值
    TL0 =0X0;
    TH0 =0X0;
    TR0 = 1;                                    //启动定时器
    ET0 = 1;                                    //使能定时器中断
    IPH =IPH;
    PT0 = 1;
}

u16CYCLE_COUNT=0,CYCLE_COUNT_L=0, th=0,th1=0;tl=0;
u16CYCLE_COUNT1=0;
u8   CYCLE_COUNT_H=0;
u16Five_Average={0};
u16Average_Value={0};
u8   i=0,j=0;
u16 max_val,min_val,sum=0,average=0;

void Timer1_ISR_Handler (void) interrupt TMR1_VECTOR                //进中断时已经清除标志
{
    start:   
    th=TH0;
    tl=TL0;
    th1=TH0;
    if(th1!=th)goto start;
   
    CYCLE_COUNT=th*0xff+tl;
    TH0=0;TL0=0;
      
   Five_Average=CYCLE_COUNT;
   sum += Five_Average;
   i++;
    if(i==2)
    {
//      max_val = Five_Average;
//      min_val = Five_Average;
//      for(j = 0; j < 5; j++)
//      {
//            if(Five_Average > max_val) {
//                max_val = Five_Average;
//            }
//            if(Five_Average < min_val) {
//                min_val = Five_Average;
//            }
//            sum += Five_Average;
//         }      
//            // 减去最大值和最小值
//         sum -= (max_val + min_val);
//            
            // 计算平均值
         average = sum >>1;
         i=0;
   }   


    CYCLE_COUNT1++;
    if(CYCLE_COUNT1>1000){CYCLE_COUNT1=0;OUT_PIN=!OUT_PIN;}
    //
}


void Timer0_ISR_Handler (void) interrupt TMR0_VECTOR                //进中断时已经清除标志
{

}

void main(void)
{   
    EAXSFR();                /* 扩展寄存器访问使能 */
    GPIO_config();
    UART_config();
    Timer1_config();
    Timer0_config();
//    INTCLKO = 0x10;
//    IPH=IPH|PX1H;
    AUXR=AUXR|0x80;
    EA = 1;
    printf("****************printf test********************** \r\n");

    while(1)//改为1ms计数一次判断高低电平
    {
//      CYCLE_COUNT=100;
      printf("average=%d\n\r,CYCLE_COUNT=%d\n\r",average,CYCLE_COUNT);
   

      delay_ms(100);
    }
}



haiyang201 发表于 2024-12-30 13:59:04

{:yiwen:}

STC8G-学习 发表于 2024-12-30 14:00:13

haiyang201 发表于 2024-12-30 13:59
平均值不一定是整数,改成浮点数试试

谢谢您的回复,刚查到问题了是sum没有及时清零导致的。{:touxiao:}

Ayb_ice 发表于 2024-12-30 14:28:13

STC8G-学习 发表于 2024-12-30 14:00
谢谢您的回复,刚查到问题了是sum没有及时清零导致的。

CYCLE_COUNT=th*256+tl;
不是乘以0xff

xiaohaha 发表于 2024-12-30 15:54:20

加油

STC8G-学习 发表于 2024-12-30 16:01:13

Ayb_ice 发表于 2024-12-30 14:28
CYCLE_COUNT=th*256+tl;
不是乘以0xff

不是,类似十进制100=1*100+0;而不是=1*99+0;我刚才验证了下,是256。谢谢您的回复,我又好好思考了下。

STC8G-学习 发表于 2024-12-30 16:05:35

xiaohaha 发表于 2024-12-30 15:54
加油

谢谢您的鼓励!

wangxiangtan 发表于 2024-12-30 19:58:35

<p>能找到问题、解决问题就前途大大滴</p>

xiaohaha 发表于 2024-12-31 09:07:53

dongge 发表于 2024-12-30 20:12
搞不懂

哈哈哈一样

xiaohaha 发表于 2025-1-5 00:32:31

STC8G-学习 发表于 2024-12-30 16:05
谢谢您的鼓励!

加油吧
页: [1]
查看完整版本: 8G1K08-38I-QFN20芯片编程求平均值,数据不对。