<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 基于STM32的PCL6045B開發(fā)體會(huì)

          基于STM32的PCL6045B開發(fā)體會(huì)

          作者: 時(shí)間:2016-12-01 來(lái)源:網(wǎng)絡(luò) 收藏
          上兩個(gè)月做了個(gè)關(guān)于尿殘?jiān)男马?xiàng)目,用到了電機(jī)驅(qū)動(dòng)芯片PCL6045BL。這個(gè)系統(tǒng)方案有一個(gè)20余年工作經(jīng)驗(yàn)的老工程師提出來(lái),主要采用的是STM32操作PCL6045,進(jìn)而控制多軸電機(jī)運(yùn)動(dòng)。

          于是公司從每個(gè)不同項(xiàng)目組抽選人員組成了一個(gè)團(tuán)隊(duì)。本人負(fù)責(zé)軟件部分,負(fù)責(zé)編寫驅(qū)動(dòng)程序和調(diào)試電路板。
          全新項(xiàng)目,有一定挑戰(zhàn)性。經(jīng)過(guò)分析,決定采用STM32總線方式(FSMC)驅(qū)動(dòng)PCL6045B。對(duì)比FSMC的四種總線操作時(shí)序和PCL6045B操作時(shí)序。認(rèn)為應(yīng)該選用STM32的PCCARD模式操作。從數(shù)據(jù)庫(kù)中查找了一些文獻(xiàn)資料,就開干起來(lái)了。
          兩名硬件工程師按我的需求設(shè)計(jì)好硬件電路板。

          本文引用地址:http://www.ex-cimer.com/article/201612/324398.htm

          接下來(lái)分成以下幾個(gè)步驟進(jìn)行:
          首先就是建立通訊。讓ARM能跟PCL6045B建立起來(lái)通訊。
          這一步主要就是配置STM32的FSMC為PCCARD模式,配置的過(guò)程就是按官方手冊(cè)上配置的。先系統(tǒng)初始化配置好STM32的時(shí)鐘(不贅述)。然后就是初始化端口,這里需要注意的是,要將跟FSMC相關(guān)的端口都設(shè)置為特殊功能口AF。如下:
          void PCCARD_IO_Init(void)
          {
          GPIO_InitTypeDef GPIO_InitStructure;
          RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD RCC_APB2Periph_GPIOE RCC_APB2Periph_GPIOF RCC_APB2Periph_GPIOG,ENABLE);
          GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 GPIO_Pin_2 GPIO_Pin_3 GPIO_Pin_4 GPIO_Pin_12 GPIO_Pin_5;
          GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
          GPIO_Init(GPIOF, &GPIO_InitStructure);
          GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 GPIO_Pin_8 GPIO_Pin_9 GPIO_Pin_10 GPIO_Pin_11 GPIO_Pin_12 GPIO_Pin_13 GPIO_Pin_14 GPIO_Pin_15;
          GPIO_Init(GPIOE, &GPIO_InitStructure);
          GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14 GPIO_Pin_15 GPIO_Pin_10 GPIO_Pin_9 GPIO_Pin_8 GPIO_Pin_1 GPIO_Pin_0;
          GPIO_Init(GPIOD, &GPIO_InitStructure);
          GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 GPIO_Pin_5;//NOE,NWE引腳
          GPIO_Init(GPIOD, &GPIO_InitStructure);
          GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//cs
          GPIO_Init(GPIOG, &GPIO_InitStructure);
          }
          接下來(lái)就是配置FSMC PC卡模式時(shí)序。如下:
          void PCCARD_Init(void)
          {
          FSMC_PCCARDInitTypeDef FSMC_PCCARDInitStructure;
          FSMC_NAND_PCCARDTimingInitTypeDef p;
          RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC, ENABLE);////
          p.FSMC_SetupTime = 0x02;
          p.FSMC_WaitSetupTime = 0x04;
          p.FSMC_HoldSetupTime = 0x02;
          p.FSMC_HiZSetupTime = 0x03;
          FSMC_PCCARDInitStructure.FSMC_Waitfeature = FSMC_Waitfeature_Enable ; //使能等待
          FSMC_PCCARDInitStructure.FSMC_TCLRSetupTime = 0x10;
          FSMC_PCCARDInitStructure.FSMC_TARSetupTime = 0x10;
          FSMC_PCCARDInitStructure.FSMC_CommonSpaceTimingStruct = &p;
          FSMC_PCCARDInitStructure.FSMC_AttributeSpaceTimingStruct = &p;
          FSMC_PCCARDInitStructure.FSMC_IOSpaceTimingStruct = &p;
          FSMC_PCCARDInit(&FSMC_PCCARDInitStructure);
          FSMC_PCCARDCmd(ENABLE);
          }
          到這里,就算配置完成。主函數(shù)調(diào)用。
          然后主函數(shù)通過(guò)控制PCL6045的其中一個(gè)口實(shí)驗(yàn)成功,于是就算建立起了通信。
          接下來(lái)就可以試驗(yàn)控制PCL6045參數(shù)指定數(shù)目的脈沖了。
          于是,我根據(jù)手冊(cè)又編寫了如下小測(cè)試程序:
          p645_wreg(AXS_AU, WPRMD, 0x00000041); //定長(zhǎng)運(yùn)動(dòng)模式
          p645_wreg(AXS_AU, WRMV, 4012000000);
          p645_wreg(AXS_AU, WRFL, 500L);
          p645_wreg(AXS_AU, WRFH, 20000L);
          p645_wreg(AXS_AU, WRUR, 200L);
          p645_wreg(AXS_AU, WRDR, 400L);
          p645_wreg(AXS_AU, WRMG, 29L);
          p645_wcom(AXS_AU,STAUD);
          運(yùn)行,成功產(chǎn)生脈沖!
          正常過(guò)程很簡(jiǎn)單,但是,實(shí)際操作中,特別是第一次摸索的時(shí)候,遇到很多棘手的問(wèn)題。
          比如PCL6045 硬件部分IF0 IF1 要接成8086方式。
          一開始,我們的硬件電路按如下圖鏈接:
          好像也沒(méi)什么問(wèn)題,于是就接著往下調(diào),發(fā)現(xiàn)了一個(gè)很郁悶的問(wèn)題,當(dāng)時(shí)把問(wèn)題描述如下:
          #define AXS_AX ((volatile unsigned int ) 0x90000000)
          #define AXS_AY ((volatile unsigned int ) 0x90000004)
          #define AXS_AZ ((volatile unsigned int ) 0x9000008)
          #define AXS_AU ((volatile unsigned int ) 0x900000c)
          其中 AXS_AX、AXS_AY、AXS_AZ、AXS_AU 分別表示 X、Y、Z、U 軸寄存器的起始地址
          幾個(gè)地址均已經(jīng)能夠操作,能控制各個(gè)軸電機(jī)運(yùn)動(dòng)。
          STM32通過(guò)FSMC與DSP通訊,通過(guò)16位傳送數(shù)據(jù)。
          #define outpw( address,data) (*(unsigned short *)(address)=(data));
          unsigned int inpw(unsigned int address) //讀寫某一段內(nèi)存
          {
          unsigned short data;
          data=*(unsigned short*)address;
          return data;
          }
          寫寄存器函數(shù)如下:
          void p645_wreg(unsigned int base_addr,unsigned int rwcom,unsigned int data) //向某個(gè)軸的某個(gè)寄存器寫入數(shù)據(jù)
          {
          union udata{
          unsigned int ldata;
          unsigned short idata[2];
          }udt;
          udt.ldata = data;
          outpw (base_addr 2, udt. idata[0]);
          // Delay_Us(1); //就算加了延時(shí)也無(wú)效
          outpw (base_addr 3, udt. idata[1]);
          // Delay_Us(1); //就算加了延時(shí)也無(wú)效
          outpw (base_addr, rwcom);
          }
          //讀寄存器函數(shù)如下:
          unsigned long p645_rreg (unsigned int base_addr,unsigned int rrcom) //讀寄存器
          {
          unionudata{
          unsigned int ldata;
          unsigned short idata[2];
          }udt;
          outpw(base_addr, rrcom);
          // Delay_Us(1);
          udt.idata[0] = inpw (base_addr 2);
          // Delay_Us(1);
          udt.idata[1] = inpw (base_addr 3);
          return(udt. ldata);
          }
          在設(shè)置解碼倍頻時(shí),發(fā)現(xiàn),無(wú)論我寫入的是哪個(gè)數(shù)(00,01,10),都不能改變編碼器讀出的數(shù)據(jù),即始終是默認(rèn)的1倍解碼,即相關(guān)寄存器兩個(gè)bit是00的情況.


          上一頁(yè) 1 2 下一頁(yè)

          關(guān)鍵詞: STM32PCL6045B開發(fā)體

          評(píng)論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();