发新帖本帖赏金 3.00元(功能说明)我要提问
12
返回列表
打印
[STM32F1]

ST分享大集结+STM32 ADXL345 加速度传感器

[复制链接]
楼主: gaoke231
手机看帖
扫描二维码
随时随地手机跟帖
21
gaoke231|  楼主 | 2017-11-26 22:47 | 只看该作者 回帖奖励 |倒序浏览
ADX345进行校正。
void ADX345_Adjust(void)
{
    int32_t offx = 0, offy = 0, offz = 0;
    int16_t xValue, yValue, zValue;
    uint8_t i;

        ADX345_WriteReg(ADX_POWER_CTL, 0x00);         //先进入休眠模式.
        ADX345_DelayMs(100);
        ADX345_Init();
    ADX345_DelayMs(20);
   
    /* 读取十次数值 */
    for(i=0; i<10; i++)
    {
        ADX345_ReadXYZ(&xValue, &yValue, &zValue);
        offx += xValue;
        offy += yValue;
        offz += zValue;
        ADX345_DelayMs(10);   //才样频率在100HZ,10ms采样一次最好         
    }
   
    /* 求出平均值 */
    offx /= 10;
    offy /= 10;
    offz /= 10;
   
    /* 全分辨率下,每个输出LSB为3.9 mg或偏移寄存器LSB的四分之一,所以除以4 */
    xValue = -(offx / 4);
        yValue = -(offy / 4);
        zValue = -((offz - 256) / 4);
   
    /* 设置偏移量 */
        ADX345_WriteReg(ADX_OFSX, xValue);
        ADX345_WriteReg(ADX_OFSY, yValue);
        ADX345_WriteReg(ADX_OFSZ, zValue);
            
}

使用特权

评论回复
22
gaoke231|  楼主 | 2017-11-26 22:47 | 只看该作者
读取ADX的XYZ轴的值(进行过数据处理)
void ADX_GetXYZData(int16_t *xValue, int16_t *yValue, int16_t *zValue)
{
    int32_t xTotal = 0, yTotal = 0, zTotal = 0;
    uint8_t i;
   
    *xValue = 0;
    *yValue = 0;
    *zValue = 0;

    /* 读取十次采样值 */
    for(i=0; i<10; i++)
    {
        ADX345_ReadXYZ(xValue, yValue, zValue);
        xTotal += *xValue;
        yTotal += *yValue;
        zTotal += *zValue;
        ADX345_DelayMs(10);  //才样频率在100HZ,10ms采样一次最好
    }
   
    /* 求出平均值 */
    *xValue = xTotal / 10;
    *yValue = yTotal / 10;
    *zValue = zTotal / 10;      
}

使用特权

评论回复
23
gaoke231|  楼主 | 2017-11-26 22:48 | 只看该作者
将AD值转换成角度值
int16_t ADX_GetAngle(float xValue, float yValue, float zValue, uint8_t dir)
{
        float temp;
        float res = 0;

        switch(dir)
        {   
        /* 与自然Z轴的角度 */
                case 0:
                        temp = sqrt((xValue * xValue + yValue * yValue)) / zValue;
                        res = atan(temp);
                        break;
        
        /* 与自然X轴的角度 */
                case 1:
                        temp = xValue / sqrt((yValue * yValue + zValue * zValue));
                        res = atan(temp);
                        break;

        /* 与自然Y轴的角度 */
                case 2:
                        temp = yValue / sqrt((xValue * xValue + zValue * zValue));
                        res = atan(temp);
                        break;

        default:
            break;
        }

使用特权

评论回复
24
gaoke231|  楼主 | 2017-11-26 22:49 | 只看该作者
int8_t SYSTEM_SetClock(uint8_t freq)
{
    ErrorStatus HSEStartUpStatus;
    uint32_t pllMul;

    /* 选择倍频系数 */
    switch(freq)
    {
        case(32):
            pllMul = RCC_PLLMul_4;
            break;
        case(40):
            pllMul = RCC_PLLMul_5;
            break;
        case(48):
            pllMul = RCC_PLLMul_6;
            break;
        case(56):
            pllMul = RCC_PLLMul_7;
            break;
        case(64):
            pllMul = RCC_PLLMul_8;
            break;
        case(72):
            pllMul = RCC_PLLMul_9;
            break;
        default:
            RCC_DeInit();
            return -1;
    }
        
    /* 复位RCC */
    RCC_DeInit();
   
    /* 使能打开HSE外部高速时钟 */
    RCC_HSEConfig(RCC_HSE_ON);

    /* 等待HSE时钟就绪 */
    HSEStartUpStatus = RCC_WaitForHSEStartUp();
   
    /* 当HSE时钟就绪 */
    if (HSEStartUpStatus == SUCCESS)
    {
        /* 使能开启FLASH ,允许程序去操作FLASH上面的数据,要是不设置程序会出错 */
        FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
        
        /* FLASH代码2个延时周期 */
        FLASH_SetLatency(FLASH_Latency_2);
      
        /* 设置AHB总线的时钟分频 */
        RCC_HCLKConfig(RCC_SYSCLK_Div1);        //不分频
        
        /* 设置高速时钟的时钟分频(最大72MHZ) */
        RCC_PCLK2Config(RCC_HCLK_Div1);         //不分频
        
        /* 设置低速时钟的时钟分频(最大36MHZ) */
        RCC_PCLK1Config(RCC_HCLK_Div2);         //二分频
        
        /* 设置PLL的时钟输入和倍频数 */
        RCC_PLLConfig(RCC_PLLSource_HSE_Div1, pllMul);//选择HSE不分频输入,倍频pllMul倍
        
        /* 开启 PLL */
        RCC_PLLCmd(ENABLE);
        
        /* 等待PLL时钟就绪 */
        while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
        {
        }

        /* 选择PLL时钟作为输入 */
        RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

        /* 等待系统时钟切换完成 */
        while(RCC_GetSYSCLKSource() != 0x08)
        {
        }
    }
    else              //若HSE时钟开始失败,返回设置失败
    {
        return -1;  
    }

    return 0;         //返回设置成功
}

使用特权

评论回复
25
gaoke231|  楼主 | 2017-11-26 22:50 | 只看该作者
void SYSTICK_Config(void)
{
    /* 时钟是72MHZ时,所以计数72次(最大为16777215),就是1us */
        /* 主要是为了设置时钟 */
        if(SysTick_Config(72) == 0)//开启成功返回0
        {
                /* 调用这个设置函数的时候默认是直接打开计数器的,现在把它关掉。 */
                /* 关闭中断 */       
                 SysTick->CTRL &= ~(SysTick_CTRL_ENABLE_Msk | SysTick_CTRL_TICKINT_Msk);                        
        }   
}

使用特权

评论回复
26
gaoke231|  楼主 | 2017-11-30 22:33 | 只看该作者
在主函数里面我们要先进行初始化
TFT_Init();
    FLASH_Init();
    SYSTICK_Config();
    USART1_Config(9600);
    LED_Config();

使用特权

评论回复
27
gaoke231|  楼主 | 2017-11-30 22:34 | 只看该作者
包括TFT彩屏的初始化 flash初始化  系统定时器初始化  串口1初始化  

使用特权

评论回复
28
gaoke231|  楼主 | 2017-11-30 22:37 | 只看该作者
彩屏显示 以及系统的时间心跳
GUI_Show12Char(60, 42, "ADX345 ERROR!", RED, BLACK);
SYSTICK_Delay1ms(100);

使用特权

评论回复
29
gaoke231|  楼主 | 2017-11-30 22:38 | 只看该作者
在主程序中调用 ADX345_Adjust(); 获取数据。

使用特权

评论回复
30
gaoke231|  楼主 | 2017-11-30 22:38 | 只看该作者
/* 读取X,Y,Z的加速度值 */
            ADX_GetXYZData(&Xval, &Yval, &Zval);
            printf(" x:%d \n", Xval);
            printf(" y:%d \n", Yval);
            printf(" z:%d \n", Zval);

            /* 将读取到的加速度值转换为角度值 */
            Xang=ADX_GetAngle(Xval, Yval, Zval,1);   
                        Yang=ADX_GetAngle(Xval, Yval, Zval,2);   
                        Zang=ADX_GetAngle(Xval, Yval, Zval,0);
            GUI_DisplayData();

使用特权

评论回复
31
gaoke231|  楼主 | 2017-11-30 22:39 | 只看该作者
读取数据并实时显示,我们晃动板子数据会发生变化

使用特权

评论回复
32
gaoke231|  楼主 | 2017-11-30 22:40 | 只看该作者
可以将这个与控制电机模块结合做一个智能控制设备,其中的乐趣自己去探索。

使用特权

评论回复
33
gaoke231|  楼主 | 2017-11-30 22:42 | 只看该作者
有更好的想法可以传上来分享,这次结帖了。

使用特权

评论回复
发新帖 本帖赏金 3.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则