新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 步進電機加減速程序,適合做GPIO設置

        步進電機加減速程序,適合做GPIO設置

        作者: 時間:2016-12-02 來源:網絡 收藏
        #include"stm32f10x_lib.h"
        #include"main.h"
        TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
        GPIO_InitTypeDef GPIO_InitStructure;
        ErrorStatus HSEStartUpStatus;
        TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
        int pulse;
        int StepCount;
        int pulse1;
        int pulse2;
        int t1;
        int t2;
        int r1;
        int r2;
        void RCC_Configuration(void);
        void NVIC_Configuration(void);
        void GPIO_Configuration(void);
        void TIM2_Configuration(void);
        void f(int Vt,int a,int d,int S);
        #define VECT_TAB_RAM
        int main(void)
        {
        #ifdef DEBUG
        debug();/*[初始化外圍設備指針]*/
        #endif
        RCC_Configuration(); //初始化時鐘與復位
        NVIC_Configuration();//初始化中斷嵌套
        TIM2_Configuration();//初始化定時器
        GPIO_Configuration();

        GPIO_WriteBit(GPIOD, GPIO_Pin_7, (BitAction)(0));
        GPIO_WriteBit(GPIOD, GPIO_Pin_6, (BitAction)(0)); //DCY1 DCY2為00,即Normal %0 DECAY

        GPIO_WriteBit(GPIOE, GPIO_Pin_7, (BitAction)(1));
        GPIO_WriteBit(GPIOB, GPIO_Pin_1, (BitAction)(0)); //M1M2為10,即1-2-phase
        //GPIO_WriteBit(GPIOA, GPIO_Pin_4, (BitAction)(1)); //正向旋轉
        //GPIO_WriteBit(GPIOA,GPIO_Pin_4,(BitAction)(1-GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_4)));正、反向旋轉控制

        GPIO_WriteBit(GPIOB, GPIO_Pin_0, (BitAction)(0));
        GPIO_WriteBit(GPIOC, GPIO_Pin_5, (BitAction)(1)); //TQ1 TQ2為01,即Current Ratio為50%

        GPIO_WriteBit(GPIOA, GPIO_Pin_7, (BitAction)(1)); //StepReset位
        GPIO_WriteBit(GPIOC, GPIO_Pin_4, (BitAction)(1)); //StepEn 使能位

        while(1)
        {
        r1=0;
        r2=10;
        StepCount=0;
        GPIO_WriteBit(GPIOA,GPIO_Pin_4,(BitAction)(1-GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_4)));
        TIM2_Configuration();
        do
        {
        }while(r2);

        TIM_Cmd(TIM2, DISABLE);
        Delay(7000000);
        }
        }
        void GPIO_Configuration(void)
        {
        GPIO_InitTypeDef GPIO_InitStructure;
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_7; //PA的3.4.7接CLK,CW/CCW,StepReset
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_Init(GPIOA,&GPIO_InitStructure);
        GPIO_InitStructure.GPIO_Pin= GPIO_Pin_5 | GPIO_Pin_6; //PA的6.7接Protect和Mo
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_Init(GPIOA,&GPIO_InitStructure);
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4 | GPIO_Pin_5; //PC的4.5接StepEn和TQ2
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_Init(GPIOC,&GPIO_InitStructure);
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0 | GPIO_Pin_1; //PB的0.1接TQ1和M2
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_Init(GPIOB,&GPIO_InitStructure);
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_7; //PE7接M1
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_Init(GPIOE,&GPIO_InitStructure);
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6 | GPIO_Pin_7; //PD的67接DCY2和DCY1
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_Init(GPIOD,&GPIO_InitStructure);
        }
        void NVIC_Configuration(void)
        {
        NVIC_InitTypeDef NVIC_InitStructure;
        #ifdef VECT_TAB_RAM
        NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
        #else
        NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
        #endif
        NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQChannel; //設置TIM2通道輸入中斷
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; /*配置優先級組*/
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; /*允許TIM2全局中斷*/
        NVIC_Init(&NVIC_InitStructure);
        }
        void TIM2_Configuration(void)
        {
        TIM_SetCounter( TIM2, 0x0000);
        TIM_ClearFlag(TIM2, TIM_FLAG_Update); /*清除更新標志位*/
        TIM_ClearITPendingBit(TIM2, TIM_FLAG_Update); //清除TIM2等待中斷更新中斷標志位
        TIM_ARRPreloadConfig(TIM2, ENABLE); /*預裝載寄存器的內容被立即傳送到影子寄存器 */
        TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); //使能TIM2的更新
        TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
        TIM_TimeBaseStructure.TIM_Period = 2000; //設定的最大計數值2000,最大計數值是0xffff
        TIM_TimeBaseStructure.TIM_Prescaler = 72; //分頻72
        TIM_TimeBaseStructure.TIM_ClockDivision = 0; //時鐘分割
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //計數方向向上計數
        TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
        TIM_Cmd(TIM2, ENABLE); //TIM2 enable counter
        }
        void RCC_Configuration(void)
        {
        RCC_DeInit();
        RCC_HSEConfig(RCC_HSE_ON);
        HSEStartUpStatus = RCC_WaitForHSEStartUp();
        if(HSEStartUpStatus == SUCCESS)
        {
        FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
        FLASH_SetLatency(FLASH_Latency_2);
        RCC_HCLKConfig(RCC_SYSCLK_Div1);
        RCC_PCLK2Config(RCC_HCLK_Div1);
        RCC_PCLK1Config(RCC_HCLK_Div2);
        RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
        RCC_PLLCmd(ENABLE);
        while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
        {
        }
        RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
        while(RCC_GetSYSCLKSource() != 0x08)
        {
        }
        }
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC
        | RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE,ENABLE);
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //打開TIM2的時鐘
        }
        void Delay(u32 nCount)
        {
        do{
        }
        while(nCount--);
        }
        void f(int Vt,int a,int d,int S)
        {
        int pulse1;
        int pulse2;
        t1=Vt/a;

        if(StepCount {
        r1++;
        pulse1=(150000*t1)/(r1*Vt);
        TIM_SetAutoreload(TIM2,pulse1);
        }

        if(t1<=StepCount<=4*S) //勻速階段運行要求的步數或者距離
        {
        pulse=150000/Vt;
        TIM_SetAutoreload(TIM2,pulse);
        }
        if(StepCount>4*S) //減速階段,走完S步后開始減速,分t2-1級減速
        {
        r2--;

        if(t2>=1)
        {
        pulse2=(150000*t2)/(r2*Vt);
        TIM_SetAutoreload(TIM2,pulse2);
        }
        }
        }
        main.h文件內容:
        #define StepEnPin GPIO_Pin_4
        extern int S;
        extern int t1;
        extern int r2;
        extern int pulse1;
        extern int pulse2;
        extern int StepCount;
        extern TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
        void Delay(u32 nCount);
        void f(int Vt,int a,int d,int S);
        TIM2中斷函數程序:
        void TIM2_IRQHandler(void)
        {
        if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET)
        {
        TIM_ClearFlag(TIM2, TIM_FLAG_Update);
        GPIO_WriteBit(GPIOA,GPIO_Pin_3,(BitAction)(1-GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_3)));
        StepCount=StepCount+1;
        f(300,10,10,4000);

        }
        }


        評論


        技術專區

        關閉
        主站蜘蛛池模板: 蕉岭县| 吉林省| 齐河县| 合阳县| 金阳县| 吉安市| 曲周县| 磴口县| 休宁县| 济阳县| 廉江市| 湟源县| 库尔勒市| 西乌| 长顺县| 永清县| 和林格尔县| 莱阳市| 讷河市| 磴口县| 遵义市| 缙云县| 五莲县| 黑山县| 绥阳县| 利津县| 莎车县| 赫章县| 尚义县| 江陵县| 高陵县| 镇赉县| 尉氏县| 康乐县| 科技| 泊头市| 绥中县| 武平县| 武陟县| 北流市| 渝中区|