欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
基于SM32的脈沖輸出定位控制程序 平衡車的相關文件
[打印本頁]
作者:
小眼睛好心情
時間:
2017-8-11 20:45
標題:
基于SM32的脈沖輸出定位控制程序 平衡車的相關文件
給大家分享一些平衡車的相關文件,
基于SM32的脈沖輸出定位控制
0.png
(37.96 KB, 下載次數: 76)
下載附件
2017-8-11 21:15 上傳
所有資料51hei提供下載:
基于SM32的脈沖輸出定位控制.rar
(276.16 KB, 下載次數: 21)
2017-8-11 20:45 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
TIMER2_PWM_005單片機源程序如下(stm32芯片):
/*簡易運動控制器*/
/*脈沖+方向控制步進伺服電機*/
/*由PORTA.0口輸出占空比為50%的脈沖*/
/*GPIOA.0為脈沖輸出*/
/*GPIOB.5為方向輸出*/
/*DRVI(A,B);相對定位,以B的頻率輸出A(A取絕對值)個脈沖A不能為0,若A為正數,方向GPIOB.5為高電平;反之,負數,低電平*/
/*DRVA(A,B);絕對定位,以B的頻率輸出脈沖,運行至A個脈沖的位置*/
#include "stm32reg.h"
#include "system_stm32.h"
long mubiao;//有符號方向
long dangqian;//有符號方向
STATUS_Type run;
void MyTimer2_Init()
{
RSTCLKCTRL->APB2CLKEN|=(1<<2)|(1<<0);//使能AFIO、GPIOA時鐘
GPIOA->CONFG[0]&=0xfffffff0;
GPIOA->CONFG[0]|=0x0000000a; //配置PORTA.0為復用推挽輸出,輸出最大頻率2MHz
RSTCLKCTRL->APB1CLKEN|=1; //使能定時器TIMER2時鐘
TIMER2->PRESC=64-1; //設置定時器2預分頻值,使定時器得到1MHz的計數頻率
TIMER2->CONTROL1|=1<<2; //設置只有計數溢出作為更新中斷
TIMER2->DMAINTEN|=1<<0; //允許定時器2計數溢出中斷
Interrupt_Priority(28,0,2,group_2); //使能第28號中斷(即定時器2全局中斷),搶占0響應2,中斷分組2
TIMER2->CAPCMPMOD1&=~(3<<0); //CC1通道配置為輸出模式
TIMER2->CAPCMPMOD1|=7<<4; //輸出比較1為PWM模式2
TIMER2->CAPCMPEN|=1<<0; //通道1輸出使能
}
void Timer2_Startup(u16 frequency) //啟動定時器2
{
if(frequency<20) frequency=20; //最小頻率設定為20,因為頻率設定過小,得到的重裝值會超出16位
TIMER2->RELOAD=1000000/frequency-1; //設定重裝值
TIMER2->CAPCMP1=TIMER2->RELOAD>>1; //匹配值1等于重裝值一半,是以占空比為50%
MyDelay(10,ms); //脈沖信號比方向信號滯后,以提高可靠性
TIMER2->CONTROL1|=1<<0; //啟動定時器TIMER2計數
}
void DRVI(long num,u16 frequency) //相對定位函數
{
if(num>0)
{
GPIOB->BITSETRST=1<<5;
}
else if(num<0)
{
GPIOB->BITRST=1<<5;
}
mubiao=dangqian+num;
Timer2_Startup(frequency);
}
void DRVA(long num,u16 frequency) //絕對定位函數
{
mubiao=num;
if(mubiao==dangqian)
{
run=OFF;
}
else
{
if(mubiao>dangqian)
{
GPIOB->BITSETRST=1<<5;
}
else
{
GPIOB->BITRST=1<<5;
}
Timer2_Startup(frequency);
}
}
void TIM2_IRQHandler() //定時器2全局中斷函數
{
if(TIMER2->STATUS&0x0001)
{
if(GPIOB->OUTDATA&(1<<5)) //如果方向為正
{
dangqian++;
}
else //否則方向為負
{
dangqian--;
}
if(dangqian==mubiao) //計數溢出次數、也即輸出的脈沖個數達到目標值
{
TIMER2->CONTROL1&=~(1<<0); //停止定時器2計數、也即停止脈沖輸出
run=OFF; //復位脈沖定位指令執行標志
}
TIMER2->STATUS=0x0000;
}
}
int main(void)
{
u32 tp,tp1;
mubiao=0;//目標位置脈沖值
dangqian=0;//當前位置脈沖值
run=OFF;//脈沖定位指令執行標志
System_Init();
RSTCLKCTRL->APB2CLKEN|=(1<<3)|(1<<6);//使能GPIOB、GPIOE時鐘
GPIOB->CONFG[0]&=0xff0fffff;
GPIOB->CONFG[0]|=0x00300000;//GPIOB.5配置為推挽輸出,作為脈沖的方向信號輸出
GPIOB->BITRST=1<<5;
GPIOE->CONFG[0]&=0xfff00000;
GPIOE->CONFG[0]|=0x00088888;//GPIOE.0/1/2/3/4配置為上下拉輸入,作為按鍵
GPIOE->BITRST=0x001f;
Interrupt_Group(group_2);//中斷分組,只要一次
MyTimer2_Init();//定時器2初始化
while(1)
{
tp=GPIOE->INDATA;//讀取按鍵輸入
if(tp&0x001f)
{
MyDelay(10,ms);//延時消抖,輸入濾波
tp1=GPIOE->INDATA;//再次讀取按鍵輸入
if((tp&0x001f)&&(tp==tp1))//確實有按鍵輸入,且兩次讀取的值一致
{
if(run==OFF)//如果此時正在發生脈沖輸出,不接受新命令,
{
run=ON;//置位脈沖定位指令執行標志
switch(tp&0x001f)
{
case 0x0001:DRVI(20,20);break;//按下按鍵PE0,前進20脈沖
case 0x0002:DRVI(-25,33);break;//按下按鍵PE1,后退25脈沖
case 0x0004:DRVA(0,50);break;//按下按鍵PE2,回零點
case 0x0008:DRVA(15,25);break;//按下按鍵PE3,運動到絕對位置15脈沖處
case 0x0010:DRVA(-5,40);break;//按下按鍵PE4,運動到絕對位置-5脈沖處
}
}
}
}
}
}
復制代碼
/*由PORTA.0口輸出占空比為50%的脈沖,脈沖數量無限,脈沖頻率指定*/
#include "stm32reg.h"
#include "system_stm32.h"
void MyTimer2_Init()
{
RSTCLKCTRL->APB2CLKEN|=(1<<2)|(1<<0);//使能AFIO、GPIOA時鐘
GPIOA->CONFG[0]&=0xfffffff0;
GPIOA->CONFG[0]|=0x0000000a; //配置PORTA.0為復用推挽輸出,輸出最大頻率2MHz
RSTCLKCTRL->APB1CLKEN|=1; //使能定時器TIMER2時鐘
TIMER2->PRESC=64-1; //設置定時器2預分頻值,使定時器得到1MHz的計數頻率
TIMER2->CAPCMPMOD1&=~(3<<0); //CC1通道配置為輸出模式
TIMER2->CAPCMPMOD1|=7<<4; //輸出比較1為PWM模式2
TIMER2->CAPCMPEN|=1<<0; //通道1輸出使能
}
void MyTimer2_Startup(u16 frequency)
{
if(frequency<20) frequency=20;
TIMER2->RELOAD=1000000/frequency-1;
TIMER2->CAPCMP1=TIMER2->RELOAD>>1;
TIMER2->CONTROL1|=1<<0; //啟動定時器TIMER2計數
}
void TIM2_IRQHandler()
{
}
int main(void)
{
System_Init();
RSTCLKCTRL->APB2CLKEN|=1<<3;
GPIOB->CONFG[0]&=0xff0fffff;
GPIOB->CONFG[0]|=0x00300000;
GPIOB->BITRST=1<<5;
//Interrupt_Group(group_2);//本例沒有使用中斷,不需要分組
MyTimer2_Init();
MyTimer2_Startup(33);
while(1)
{
GPIOB->BITRST=1<<5;
MyDelay(100,ms);
GPIOB->BITSETRST=1<<5;
MyDelay(100,ms);
}
}
復制代碼
作者:
hawee
時間:
2019-9-23 20:40
剛好需要這方面資料,謝謝分享!
作者:
yellowcf1983
時間:
2019-9-25 09:29
學習一下!謝謝!!!
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1