你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

大虾求助!将SPI+W25QXX的程序移植后,步进电机均转速转慢。

[复制链接]
wuxim 提问时间:2017-12-19 15:29 /
本人学机械出身,现遇一问题,打不到突破办法,还请各位大虾相助。
CPU:03ZET6
功能:多个步进电机控制,数据读写,串口收发等
原程序:采取内部FLASH,
现程序:增加SPI2+W25Q16
多个步进电机脉冲均由多个不同定时器PWM(TIM1\TIM2\TIM4\TIM8)或定时器中断(TIM1)生成;
现象:
1、原程序运行正常,步进电机均正常,通过示波器测量,步进脉冲信号正常。
2、现程序W25Q16读写也正常;步进电机均变慢,通过示波器测量,脉冲信号变慢很多倍,串口也通讯正常。
3、只单独作  W25QXX_Init();的声明,后面的读写都删除掉现象同样;
4、将 W25QXX_Init();函数内逐段注释后编绎,步进电机变慢速度不一样;
分析:
1、怀疑是SPI2干扰了中断,但串口工作正常,为什么不影响串口中断;不知道该如何处理;

2、怀疑是SPI2影响了时钟;不知道该如何处理;



程序通过预编绎选择来做不同程序的对比:
部分代码如下:
将W25Q不声明即为原程序;

#define W25Q

#ifdef W25Q               
          W25QXX_Init();                        
         #endif


#ifdef W25Q               
                                        W25QXX_Read(caiping_record_datatemp,10000+caiming*400,200);                                       
        #else
                                  STMFLASH_Read(FLASH_SAVE_ADDR+10000+caiming*400,(u16*)caiping_record_datatemp,200);               
         #endif

#ifdef W25Q               
                                                        W25QXX_Write(fg_all_record_data,1000+fg_all_record_name*200+record_fg_all_i*20,10);                        
        #else                        
                                                  STMFLASH_Write(FLASH_SAVE_ADDR+100000+fg_all_record_name*200+record_fg_all_i*20,(u16*)fg_all_record_data,10);        
         #endif

void W25QXX_Init(void)
{        
  GPIO_InitTypeDef GPIO_InitStructure;
        RCC_APB2PeriphClockCmd(        RCC_APB2Periph_GPIOB, ENABLE );//PORTB时钟使能

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;  // PB12 推挽
         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  //推挽输出
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
         GPIO_Init(GPIOB, &GPIO_InitStructure);
         GPIO_SetBits(GPIOB,GPIO_Pin_12);

        W25QXX_CS=1;                                //SPI FLASH不选中
        SPI2_Init();                           //初始化SPI
        SPI2_SetSpeed(SPI_BaudRatePrescaler_2);//设置为18M时钟,高速模式
        W25QXX_TYPE=W25QXX_ReadID();//读取FLASH ID.  

}  

void SPI2_Init(void)
{
         GPIO_InitTypeDef GPIO_InitStructure;
  SPI_InitTypeDef  SPI_InitStructure;

        RCC_APB2PeriphClockCmd(        RCC_APB2Periph_GPIOB, ENABLE );//PORTB时钟使能
        RCC_APB1PeriphClockCmd(        RCC_APB1Periph_SPI2,  ENABLE );//SPI2时钟使能         

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_15;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //PB13/15复用推挽输出
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOB
        
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;  //PB14浮空输入
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOB

         GPIO_SetBits(GPIOB,GPIO_Pin_13|GPIO_Pin_15);  //PB13/15上拉

        SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;  //设置SPI单向或者双向的数据模式:SPI设置为双线双向全双工
        SPI_InitStructure.SPI_Mode = SPI_Mode_Master;                //设置SPI工作模式:设置为主SPI
        SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;                //设置SPI的数据大小:SPI发送接收8位帧结构
        SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;                //串行同步时钟的空闲状态为高电平
        SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;        //串行同步时钟的第二个跳变沿(上升或下降)数据被采样
        SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;                //NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制
        SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;                //定义波特率预分频的值:波特率预分频值为256
        SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;        //指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始
        SPI_InitStructure.SPI_CRCPolynomial = 7;        //CRC值计算的多项式
        SPI_Init(SPI2, &SPI_InitStructure);  //根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器

        SPI_Cmd(SPI2, ENABLE); //使能SPI外设
        
        SPI2_ReadWriteByte(0xff);//启动传输                 


}   
收藏 评论1 发布时间:2017-12-19 15:29

举报

1个回答
努力的人 回答时间:2018-1-24 10:28:42
你应该看你的主函数,如果你读取FLASH的数据实时性不那么高,你可以使用中断,设定多长时间读取一次,你驱动电机使用的PWM应该不会受影响的

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版