发新帖我要提问
12
返回列表
打印
[STM32F4]

关于STM32涉及呼吸机的模型参考<原创,请勿随意转发>

[复制链接]
楼主: wangjiahao88
手机看帖
扫描二维码
随时随地手机跟帖
21
wangjiahao88|  楼主 | 2018-6-26 12:22 | 只看该作者 回帖奖励 |倒序浏览
#define trycount 5

unsigned int presshigh,presslow;

/*--------------------------------------------------------------------------------------------------*/
void ee_Delay(__IO uint32_t nCount)         //简单的延时函数
{
    for(; nCount != 0; nCount--);
}

使用特权

评论回复
22
wangjiahao88|  楼主 | 2018-6-26 12:22 | 只看该作者
void SM9541_read(void)
{
    unsigned char i;
    for(i=0; i<trycount; i++)
    {
        i2c_Start();
        i2c_SendByte(0X51);    //读器件地址    写入:地址最低位是0,读取:地址最低位是1
        if(!i2c_WaitAck())
        {
            i2c_Stop();
            continue;
        }

        break;
    }
    if(i==trycount) return;

    presshigh = i2c_ReadByte();

               
    i2c_Ack();

    presslow=i2c_ReadByte();
               

    i2c_NAck();

    i2c_Stop();

    ee_Delay(5000);
    ee_Delay(5000);

               
    return;

}

使用特权

评论回复
23
wangjiahao88|  楼主 | 2018-6-26 12:23 | 只看该作者
/*
*********************************************************************************************************
*        函 数 名: i2c_Delay
*        功能说明: I2C总线位延迟,最快400KHz
*        形    参:无
*        返 回 值: 无
*********************************************************************************************************
*/
static void i2c_Delay(void)
{
    uint8_t i;

    /* 
            可用逻辑分析仪测量I2C通讯时的频率
    工作条件:CPU主频168MHz ,MDK编译环境,1级优化

            经测试,循环次数为20~250时都能通讯正常

    */
    for (i = 0; i < 50; i++);
}

使用特权

评论回复
24
wangjiahao88|  楼主 | 2018-6-26 12:23 | 只看该作者
/*
*********************************************************************************************************
*        函 数 名: i2c_Start
*        功能说明: CPU发起I2C总线启动信号
*        形    参:无
*        返 回 值: 无
*********************************************************************************************************
*/
void i2c_Start(void)
{
    /* 当SCL高电平时,SDA出现一个下跳沿表示I2C总线启动信号 */
    EEPROM_I2C_SDA_1();
    EEPROM_I2C_SCL_1();
    i2c_Delay();
    EEPROM_I2C_SDA_0();
    i2c_Delay();
    EEPROM_I2C_SCL_0();
    i2c_Delay();
}

使用特权

评论回复
25
wangjiahao88|  楼主 | 2018-6-26 12:23 | 只看该作者
/*
*********************************************************************************************************
*        函 数 名: i2c_Start
*        功能说明: CPU发起I2C总线停止信号
*        形    参:无
*        返 回 值: 无
*********************************************************************************************************
*/
void i2c_Stop(void)
{
    /* 当SCL高电平时,SDA出现一个上跳沿表示I2C总线停止信号 */
    EEPROM_I2C_SDA_0();
    EEPROM_I2C_SCL_0();
    i2c_Delay();
    EEPROM_I2C_SCL_1();
    i2c_Delay();
    EEPROM_I2C_SDA_1();
    i2c_Delay();
}

使用特权

评论回复
26
wangjiahao88|  楼主 | 2018-6-26 12:24 | 只看该作者
/*
*********************************************************************************************************
*        函 数 名: i2c_SendByte
*        功能说明: CPU向I2C总线设备发送8bit数据
*        形    参:_ucByte : 等待发送的字节
*        返 回 值: 无
*********************************************************************************************************
*/
void i2c_SendByte(uint8_t _ucByte)
{
    uint8_t i;

    /* 先发送字节的高位bit7 */
    for (i = 0; i < 8; i++)
    {
        if (_ucByte & 0x80)
        {
            EEPROM_I2C_SDA_1();
        }
        else
        {
            EEPROM_I2C_SDA_0();
        }
        i2c_Delay();
        EEPROM_I2C_SCL_1();
        i2c_Delay();
        EEPROM_I2C_SCL_0();
        if (i == 7)
        {
            EEPROM_I2C_SDA_1(); // 释放总线
        }
                               
        _ucByte <<= 1;        /* 左移一个bit */
        i2c_Delay();
    }
}

使用特权

评论回复
27
wangjiahao88|  楼主 | 2018-6-26 12:24 | 只看该作者
/*
*********************************************************************************************************
*        函 数 名: i2c_ReadByte
*        功能说明: CPU从I2C总线设备读取8bit数据
*        形    参:无
*        返 回 值: 读到的数据
*********************************************************************************************************
*/
uint8_t i2c_ReadByte(void)
{
    uint8_t i;
    uint8_t value;

    /* 读到第1个bit为数据的bit7 */
    value = 0;
    for (i = 0; i < 8; i++)
    {
        value <<= 1;

        EEPROM_I2C_SCL_1();

        i2c_Delay();
        if (EEPROM_I2C_SDA_READ())
        {
            value++;
        }
        EEPROM_I2C_SCL_0();
        i2c_Delay();
    }
    return value;
}

使用特权

评论回复
28
wangjiahao88|  楼主 | 2018-6-26 12:25 | 只看该作者
/*
*********************************************************************************************************
*        函 数 名: i2c_WaitAck
*        功能说明: CPU产生一个时钟,并读取器件的ACK应答信号
*        形    参:无
*        返 回 值: 返回0表示正确应答,1表示无器件响应
*********************************************************************************************************
*/
uint8_t i2c_WaitAck(void)
{
    uint8_t re;
    EEPROM_I2C_SCL_0();        /* CPU驱动SCL = 1, 此时器件会返回ACK应答 */
    i2c_Delay();
    EEPROM_I2C_SCL_1();        /* CPU释放SDA总线 */
    i2c_Delay();
    if (EEPROM_I2C_SDA_READ())        /* CPU读取SDA口线状态 */
    {
        EEPROM_I2C_SCL_0();        /* CPU驱动SCL = 1, 此时器件会返回ACK应答 */
        re = 0;
    }
    else
    {
        re = 1;
    }
    EEPROM_I2C_SCL_0();
    i2c_Delay();
    return re;
}

使用特权

评论回复
29
wangjiahao88|  楼主 | 2018-6-26 12:26 | 只看该作者
/*
*********************************************************************************************************
*        函 数 名: i2c_Ack
*        功能说明: CPU产生一个ACK信号
*        形    参:无
*        返 回 值: 无
*********************************************************************************************************
*/
void i2c_Ack(void)
{
    EEPROM_I2C_SCL_0();        /* CPU产生1个时钟 */
    i2c_Delay();

    EEPROM_I2C_SDA_0();        /* CPU驱动SDA = 0 */
    i2c_Delay();

    EEPROM_I2C_SCL_1();        /* CPU产生1个时钟 */
    i2c_Delay();
       
    EEPROM_I2C_SCL_0();        /* CPU产生1个时钟 */
    i2c_Delay();

    EEPROM_I2C_SDA_1();
    i2c_Delay();
}

使用特权

评论回复
30
wangjiahao88|  楼主 | 2018-6-26 12:26 | 只看该作者
/*
*********************************************************************************************************
*        函 数 名: i2c_NAck
*        功能说明: CPU产生1个NACK信号
*        形    参:无
*        返 回 值: 无
*********************************************************************************************************
*/
void i2c_NAck(void)
{
    EEPROM_I2C_SCL_0();
    i2c_Delay();

    EEPROM_I2C_SDA_1();        /* CPU驱动SDA = 1 */
    i2c_Delay();

    EEPROM_I2C_SCL_1();        /* CPU产生1个时钟 */
    i2c_Delay();

    EEPROM_I2C_SCL_0();
    i2c_Delay();
}

使用特权

评论回复
31
wangjiahao88|  楼主 | 2018-6-26 12:26 | 只看该作者
/*
*********************************************************************************************************
*        函 数 名: i2c_CfgGpio
*        功能说明: 配置I2C总线的GPIO,采用模拟IO的方式实现
*        形    参:无
*        返 回 值: 无
*********************************************************************************************************
*/
void SM9541_CfgGpio(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;

    RCC_AHB1PeriphClockCmd(EEPROM_I2C_GPIO_CLK, ENABLE);        /* 打开GPIO时钟 */

    GPIO_InitStructure.GPIO_Pin = EEPROM_I2C_SCL_PIN | EEPROM_I2C_SDA_PIN;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;          /* 开漏输出 */
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_Init(EEPROM_I2C_GPIO_PORT, &GPIO_InitStructure);

    /* 给一个停止信号, 复位I2C总线上的所有设备到待机模式 */
    i2c_Stop();
}

使用特权

评论回复
32
wangjiahao88|  楼主 | 2018-6-26 12:27 | 只看该作者
压差=(presshigh<<8)+presslow;

使用特权

评论回复
33
wangjiahao88|  楼主 | 2018-6-26 12:27 | 只看该作者
        if(T6_CNT_2>10)
        {
            T6_CNT_2=0;
            SM9541_read();
        }

使用特权

评论回复
34
wangjiahao88|  楼主 | 2018-6-26 12:29 | 只看该作者
关于 三相无刷电机的 解锁:

因为这里用的现成的 电调

遵守PPM 信号公约

使用特权

评论回复
35
wangjiahao88|  楼主 | 2018-6-26 12:29 | 只看该作者
void BLCD_Unlock(void)
{

    Set_PWM(CCR_MAX);

        for(unsigned int cnt=0;cnt<0xffffe;cnt++);
        for(unsigned int cnt=0;cnt<0xffffe;cnt++);
        for(unsigned int cnt=0;cnt<0xffffe;cnt++);
        for(unsigned int cnt=0;cnt<0xffffe;cnt++);
       
    Set_PWM(CCR_MIN);
       
        for(unsigned int cnt=0;cnt<0xffffe;cnt++);
        for(unsigned int cnt=0;cnt<0xffffe;cnt++);
}

使用特权

评论回复
36
wangjiahao88|  楼主 | 2018-6-26 12:30 | 只看该作者
static void PPMx_GPIO_Config(void)
{
    /*定义一个GPIO_InitTypeDef类型的结构体*/
    GPIO_InitTypeDef GPIO_InitStructure;

    /*开启相关的GPIO外设时钟*/
    RCC_AHB1PeriphClockCmd(GENERAL_OCPWM_GPIO_CLK, ENABLE);
       
    /* 定时器通道引脚复用 */
    GPIO_PinAFConfig(GENERAL_OCPWM_GPIO_PORT,GENERAL_OCPWM_PINSOURCE,GENERAL_OCPWM_AF);
       
    /* 定时器通道引脚配置 */
    GPIO_InitStructure.GPIO_Pin = GENERAL_OCPWM_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
    GPIO_Init(GENERAL_OCPWM_GPIO_PORT, &GPIO_InitStructure);
}

使用特权

评论回复
37
wangjiahao88|  楼主 | 2018-6-26 12:31 | 只看该作者
/*
* 注意:TIM_TimeBaseInitTypeDef结构体里面有5个成员,TIM6和TIM7的寄存器里面只有
* TIM_Prescaler和TIM_Period,所以使用TIM6和TIM7的时候只需初始化这两个成员即可,
* 另外三个成员是通用定时器和高级定时器才有.
*-----------------------------------------------------------------------------
* TIM_Prescaler         都有
* TIM_CounterMode                         TIMx,x[6,7]没有,其他都有(基本定时器)
* TIM_Period            都有
* TIM_ClockDivision     TIMx,x[6,7]没有,其他都有(基本定时器)
* TIM_RepetitionCounter TIMx,x[1,8]才有(高级定时器)
*-----------------------------------------------------------------------------
*/
static void PPM_PWMOUTPUT_Config(unsigned int arr,unsigned int psc)
{
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    TIM_OCInitTypeDef  TIM_OCInitStructure;

    // 开启TIMx_CLK,x[2,3,4,5,12,13,14]
    RCC_APB1PeriphClockCmd(GENERAL_TIM_CLK, ENABLE);
        TIM_DeInit(TIM2);//初始化TIM2寄存器
       
    /* 累计 TIM_Period个后产生一个更新或者中断*/
    //当定时器从0计数到8399,即为8400次,为一个定时周期
    TIM_TimeBaseStructure.TIM_Period = arr;

    // 通用控制定时器时钟源TIMxCLK = HCLK/2=84MHz
    // 设定定时器频率为=TIMxCLK/(TIM_Prescaler+1)=100KHz
    TIM_TimeBaseStructure.TIM_Prescaler = psc;
    // 采样时钟分频
    TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
    // 计数方式
    TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;

    // 初始化定时器TIMx, x[2,3,4,5,12,13,14]
    TIM_TimeBaseInit(GENERAL_TIM, &TIM_TimeBaseStructure);

    /*PWM模式配置*/
    /* PWM1 Mode configuration: Channel1 */
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;            //配置为PWM模式1
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
    TIM_OCInitStructure.TIM_Pulse = CCR_MIN;
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;            //当定时器计数值小于CCR1_Val时为高电平

        TIM_OC2Init(GENERAL_TIM, &TIM_OCInitStructure);         //使能通道1
       
    /*使能通道1重载*/
    TIM_OC2PreloadConfig(GENERAL_TIM, TIM_OCPreload_Enable);

        TIM_ARRPreloadConfig(GENERAL_TIM, ENABLE);
       
        // 使能定时器
    TIM_Cmd(GENERAL_TIM, ENABLE);
}

使用特权

评论回复
38
wangjiahao88|  楼主 | 2018-6-26 12:31 | 只看该作者
/**
  * @brief  初始化控制通用定时器
  * @param  无
  * @retval 无
  */
void PPMx_Configuration(void)
{
    PPMx_GPIO_Config();

    PPM_PWMOUTPUT_Config(2000-1,840-1);
}

使用特权

评论回复
39
wangjiahao88|  楼主 | 2018-6-26 12:32 | 只看该作者
void Set_PWM(unsigned char CH2)
{
    TIM_SetCompare2(TIM2,CH2);
}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则