1.timer.c
void TIM3_Int_Init(u16 arr,u16 psc)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //ʱÖÓʹÄÜ
TIM_TimeBaseStructure.TIM_Period = arr; //ÉèÖÃÔÚÏÂÒ»¸ö¸üÐÂʼþ×°Èë»î¶¯µÄ×Ô¶¯ÖØ×°ÔؼĴæÆ÷ÖÜÆÚµÄÖµ ¼ÆÊýµ½5000Ϊ500ms
TIM_TimeBaseStructure.TIM_Prescaler =psc; //ÉèÖÃÓÃÀ´×÷ΪTIMxʱÖÓƵÂʳýÊýµÄÔ¤·ÖƵֵ 10KhzµÄ¼ÆÊýƵÂÊ
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //ÉèÖÃʱÖÓ·Ö¸î:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIMÏòÉϼÆÊýģʽ
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //¸ù¾ÝTIM_TimeBaseInitStructÖÐÖ¸¶¨µÄ²ÎÊý³õʼ»¯TIMxµÄʱ¼ä»ùÊýµ¥Î»
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //ʹÄÜÖ¸¶¨µÄTIM3ÖжÏ,ÔÊÐí¸üÐÂÖжÏ
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //TIM3ÖжÏ
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //ÏÈÕ¼ÓÅÏȼ¶0¼¶
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //´ÓÓÅÏȼ¶3¼¶
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQͨµÀ±»Ê¹ÄÜ
NVIC_Init(&NVIC_InitStructure); //¸ù¾ÝNVIC_InitStructÖÐÖ¸¶¨µÄ²ÎÊý³õʼ»¯ÍâÉèNVIC¼Ä´æÆ÷
TIM_Cmd(TIM3, ENABLE); //ʹÄÜTIMxÍâÉè
}
//¶¨Ê±Æ÷3ÖжϷþÎñ³ÌÐò
void TIM3_IRQHandler(void) //TIM3ÖжÏ
{
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //¼ì²éÖ¸¶¨µÄTIMÖжϷ¢ÉúÓë·ñ:TIM ÖжÏÔ´
{
TIM_ClearITPendingBit(TIM3, TIM_IT_Update ); //Çå³ýTIMxµÄÖжϴý´¦Àíλ:TIM ÖжÏÔ´
LED1=!LED1;
}
}
//TIM3 PWM²¿·Ö³õʼ»¯
//PWMÊä³ö³õʼ»¯
//arr£º×Ô¶¯ÖØ×°Öµ
//psc£ºÊ±ÖÓÔ¤·ÖƵÊý
void TIM3_PWM_Init(u16 arr,u16 psc)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //ʹÄܶ¨Ê±Æ÷3ʱÖÓ
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE); //ʹÄÜGPIOÍâÉèºÍAFIO¸´Óù¦ÄÜÄ£¿éʱÖÓ
GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); //Timer3²¿·ÖÖØÓ³Éä TIM3_CH2->PB5
//ÉèÖøÃÒý½ÅΪ¸´ÓÃÊä³ö¹¦ÄÜ,Êä³öTIM3 CH2µÄPWMÂö³å²¨ÐÎ GPIOB.5
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_0; //TIM_CH2 CH3
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //¸´ÓÃÍÆÍìÊä³ö
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);//³õʼ»¯GPIO
//³õʼ»¯TIM3
TIM_TimeBaseStructure.TIM_Period = arr; //ÉèÖÃÔÚÏÂÒ»¸ö¸üÐÂʼþ×°Èë»î¶¯µÄ×Ô¶¯ÖØ×°ÔؼĴæÆ÷ÖÜÆÚµÄÖµ
TIM_TimeBaseStructure.TIM_Prescaler =psc; //ÉèÖÃÓÃÀ´×÷ΪTIMxʱÖÓƵÂʳýÊýµÄÔ¤·ÖƵֵ
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //ÉèÖÃʱÖÓ·Ö¸î:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIMÏòÉϼÆÊýģʽ
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //¸ù¾ÝTIM_TimeBaseInitStructÖÐÖ¸¶¨µÄ²ÎÊý³õʼ»¯TIMxµÄʱ¼ä»ùÊýµ¥Î»
//³õʼ»¯TIM3 Channel2 PWMģʽ
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //Ñ¡Ôñ¶¨Ê±Æ÷ģʽ:TIMÂö³å¿í¶Èµ÷ÖÆģʽ2
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //±È½ÏÊä³öʹÄÜ
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //Êä³ö¼«ÐÔ:TIMÊä³ö±È½Ï¼«ÐÔ¸ß
TIM_OC1Init(TIM3,&TIM_OCInitStructure); //¸ù¾ÝTIMXµÄ²ÎÊýÉ趨³õʼ»¯ÍâÉè TIM1 ch1 ch2 ch3 ch4
TIM_OC2Init(TIM3,&TIM_OCInitStructure);
TIM_OC3Init(TIM3,&TIM_OCInitStructure);
TIM_OC4Init(TIM3,&TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM3,TIM_OCPreload_Enable); //ʹÄÜԤװÔؼĴæÆ÷
TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable);
TIM_OC3PreloadConfig(TIM3,TIM_OCPreload_Enable);
TIM_OC4PreloadConfig(TIM3,TIM_OCPreload_Enable);
TIM_ARRPreloadConfig(TIM3, ENABLE); //ʹÄÜTIMxÔÚARRÉϵÄԤװÔؼĴæÆ÷
TIM_CtrlPWMOutputs(TIM3,ENABLE);//TIM1Êä³öʹÄÜ ¸ß¼¶¶¨Ê±Æ÷¾ø¶ÔµÃ¼ÓÉÏÒòΪÕâ¾ä»°ÎÒ¸ãÁËÒ»¸öÍíÉÏ£¬ºóÈ˽äÖ®É÷Ö®
TIM_Cmd(TIM3,ENABLE); //ʹÄÜTIM
}
2.motor.c
void Motor_AIN(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOD, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12|GPIO_Pin_13;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOD, &GPIO_InitStructure);
GPIO_ResetBits(GPIOD,GPIO_Pin_12|GPIO_Pin_13);
}
void Motor_ZHENG(void) //????
{
GPIO_SetBits(GPIOD,GPIO_Pin_12);
GPIO_ResetBits(GPIOD,GPIO_Pin_13);
}
void Motor_OFF(void) //????
{
GPIO_ResetBits(GPIOD,GPIO_Pin_13);
GPIO_ResetBits(GPIOD,GPIO_Pin_12);
}
3.tapd.c
触摸按键控制舵机
u8 TPAD_Init(u8 psc)
{
u16 buf[10];
u16 temp;
u8 j,i;
TIM5_CH2_Cap_Init(TPAD_ARR_MAX_VAL,psc-1);//ÒÔ1MhzµÄƵÂʼÆÊý
for(i=0;i<10;i++)//Á¬Ðø¶ÁÈ¡10´Î
{
buf[i]=TPAD_Get_Val();
delay_ms(10);
}
for(i=0;i<9;i++)//ÅÅÐò
{
for(j=i+1;j<10;j++)
{
if(buf[i]>buf[j])//ÉýÐòÅÅÁÐ
{
temp=buf[i];
buf[i]=buf[j];
buf[j]=temp;
}
}
}
temp=0;
for(i=2;i<8;i++)temp+=buf[i];//È¡ÖмäµÄ6¸öÊý¾Ý½øÐÐƽ¾ù
tpad_default_val=temp/6;
printf("tpad_default_val:%d\r\n",tpad_default_val);
if(tpad_default_val>TPAD_ARR_MAX_VAL/2)return 1;//³õʼ»¯Óöµ½³¬¹ýTPAD_ARR_MAX_VAL/2µÄÊýÖµ,²»Õý³£!
return 0;
}
//¸´Î»Ò»´Î
void TPAD_Reset(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //ʹÄÜPA¶Ë¿ÚʱÖÓ
//ÉèÖÃGPIOA.1ΪÍÆÍìʹ³ö
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; //PA1 ¶Ë¿ÚÅäÖÃ
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //ÍÆÍìÊä³ö
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_ResetBits(GPIOA,GPIO_Pin_1); //PA.1Êä³ö0,·Åµç
delay_ms(5);
TIM_SetCounter(TIM5,0); //¹é0
TIM_ClearITPendingBit(TIM5, TIM_IT_CC2|TIM_IT_Update); //Çå³ýÖжϱêÖ¾
//ÉèÖÃGPIOA.1Ϊ¸¡¿ÕÊäÈë
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING; //¸¡¿ÕÊäÈë
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
//µÃµ½¶¨Ê±Æ÷²¶»ñÖµ
//Èç¹û³¬Ê±,ÔòÖ±½Ó·µ»Ø¶¨Ê±Æ÷µÄ¼ÆÊýÖµ.
u16 TPAD_Get_Val(void)
{
TPAD_Reset();
while(TIM_GetFlagStatus(TIM5, TIM_IT_CC2) == RESET)//µÈ´ý²¶»ñÉÏÉýÑØ
{
if(TIM_GetCounter(TIM5)>TPAD_ARR_MAX_VAL-500)return TIM_GetCounter(TIM5);//³¬Ê±ÁË,Ö±½Ó·µ»ØCNTµÄÖµ
};
return TIM_GetCapture2(TIM5);
}
//¶ÁÈ¡n´Î,È¡×î´óÖµ
//n£ºÁ¬Ðø»ñÈ¡µÄ´ÎÊý
//·µ»ØÖµ£ºn´Î¶ÁÊýÀïÃæ¶Áµ½µÄ×î´ó¶ÁÊýÖµ
u16 TPAD_Get_MaxVal(u8 n)
{
u16 temp=0;
u16 res=0;
while(n--)
{
temp=TPAD_Get_Val();//µÃµ½Ò»´ÎÖµ
if(temp>res)res=temp;
};
return res;
}
//ɨÃè´¥Ãþ°´¼ü
//mode:0,²»Ö§³ÖÁ¬Ðø´¥·¢(°´ÏÂÒ»´Î±ØÐëËÉ¿ª²ÅÄÜ°´ÏÂÒ»´Î);1,Ö§³ÖÁ¬Ðø´¥·¢(¿ÉÒÔÒ»Ö±°´ÏÂ)
//·µ»ØÖµ:0,ûÓа´ÏÂ;1,Óа´ÏÂ;
#define TPAD_GATE_VAL 100 //´¥ÃþµÄÃÅÏÞÖµ,Ò²¾ÍÊDZØÐë´óÓÚtpad_default_val+TPAD_GATE_VAL,²ÅÈÏΪÊÇÓÐЧ´¥Ãþ.
u8 TPAD_Scan(u8 mode)
{
static u8 keyen=0; //0,¿ÉÒÔ¿ªÊ¼¼ì²â;>0,»¹²»ÄÜ¿ªÊ¼¼ì²â
u8 res=0;
u8 sample=3; //ĬÈϲÉÑù´ÎÊýΪ3´Î
u16 rval;
if(mode)
{
sample=6; //Ö§³ÖÁ¬°´µÄʱºò£¬ÉèÖòÉÑù´ÎÊýΪ6´Î
keyen=0; //Ö§³ÖÁ¬°´
}
rval=TPAD_Get_MaxVal(sample);
if(rval>(tpad_default_val+TPAD_GATE_VAL))//´óÓÚtpad_default_val+TPAD_GATE_VAL,ÓÐЧ
{
if(keyen==0)res=1; //keyen==0,ÓÐЧ
//printf("r:%d\r\n",rval);
keyen=3; //ÖÁÉÙÒªÔÙ¹ý3´ÎÖ®ºó²ÅÄÜ°´¼üÓÐЧ
}
if(keyen)keyen--;
return res;
}
//¶¨Ê±Æ÷2ͨµÀ2ÊäÈ벶»ñÅäÖÃ
void TIM5_CH2_Cap_Init(u16 arr,u16 psc)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_ICInitTypeDef TIM5_ICInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE); //ʹÄÜTIM5ʱÖÓ
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //ʹÄÜPA¶Ë¿ÚʱÖÓ
//ÉèÖÃGPIOA.1Ϊ¸¡¿ÕÊäÈë
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; //PA1 ¶Ë¿ÚÅäÖÃ
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //ËÙ¶È50MHz
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING; //¸¡¿ÕÊäÈë
GPIO_Init(GPIOA, &GPIO_InitStructure); //ÉèÖÃΪ¸¡¿ÕÊäÈë
//³õʼ»¯TIM5
TIM_TimeBaseStructure.TIM_Period = arr; //É趨¼ÆÊýÆ÷×Ô¶¯ÖØ×°Öµ
TIM_TimeBaseStructure.TIM_Prescaler =psc; //Ô¤·ÖƵÆ÷
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //ÉèÖÃʱÖÓ·Ö¸î:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIMÏòÉϼÆÊýģʽ
TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure); //¸ù¾ÝTIM_TimeBaseInitStructÖÐÖ¸¶¨µÄ²ÎÊý³õʼ»¯TIMxµÄʱ¼ä»ùÊýµ¥Î»
//³õʼ»¯Í¨µÀ2
TIM5_ICInitStructure.TIM_Channel = TIM_Channel_2; //CC1S=01 Ñ¡ÔñÊäÈë¶Ë IC2Ó³Éäµ½TI5ÉÏ
TIM5_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //ÉÏÉýÑز¶»ñ
TIM5_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
TIM5_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //ÅäÖÃÊäÈë·ÖƵ,²»·ÖƵ
TIM5_ICInitStructure.TIM_ICFilter = 0x03;//IC2F=0011 ÅäÖÃÊäÈëÂ˲¨Æ÷ 8¸ö¶¨Ê±Æ÷ʱÖÓÖÜÆÚÂ˲¨
TIM_ICInit(TIM5, &TIM5_ICInitStructure);//³õʼ»¯I5 IC2
TIM_Cmd(TIM5,ENABLE ); //ʹÄܶ¨Ê±Æ÷5
}
void TAPD(void)
{
u8 t=0;
if(TPAD_Scan(0)) //³É¹¦²¶»ñµ½ÁËÒ»´ÎÉÏÉýÑØ(´Ëº¯ÊýÖ´ÐÐʱ¼äÖÁÉÙ15ms)
{
// LED1=!LED1; //LED1È¡·´
TIM_SetCompare3(TIM3,1945);
delay_ms(5000);
TIM_SetCompare3(TIM3,1750);
}
t++;
if(t==15)
{
t=0;
// LED0=!LED0; //LED0È¡·´,Ìáʾ³ÌÐòÕýÔÚÔËÐÐ
}
// delay_ms(10);
}