新手上路,接触STM32没多久,之前都是学习正点原子的例程。这次公司要求要做一个采集驱动器PG端信号转换之后数码管显示速度的模块,第一次自己写一个针对完整的产品的东西,也不知道算不算的上产品哈。发个帖子,自我总结,有啥不对的指正哈![mw_shl_code=c,true]#include "timer.h"
#include "74hc595.h"
#include "math.h"
u16 a,b,c,d,aaa,FlagCount=0;
u32 SpeedValue=0,count=0,times=0,TTT;
void TIM1_CH2_Init(u16 arr,u16 psc)
{
TIM_ICInitTypeDef TIM1_ICInitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); //使能时钟RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); //ê1ÄüGPIOA
//初始化捕获交 PA9 复用AF2 TIM1CH2
GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_2);/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //zz
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//3õê¼»ˉ¶¨ê±Æ÷TIM1
TIM_TimeBaseStructure.TIM_Period = arr;
TIM_TimeBaseStructure.TIM_Prescaler =psc; //Ô¤·ÖÆμÆ÷
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
//3õê¼»ˉTIM3êäèë2¶»ñ2Îêy
TIM1_ICInitStructure.TIM_Channel = TIM_Channel_2; //CC1S=01 Ñ¡Ôñêäèë¶Ë IC1ó3éäμ½TI1éÏ //zz
TIM1_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //éÏéyÑØ2¶»ñ
TIM1_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //ó3éäμ½TI1éÏ
// TIM3_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //ÅäÖÃêäèë·ÖÆμ,2»·ÖÆμ
TIM1_ICInitStructure.TIM_ICFilter = 0x00;//IC1F=0000 ÅäÖÃêäèëÂË2¨Æ÷ 2»ÂË2¨
TIM_ICInit(TIM1, &TIM1_ICInitStructure);
//ÖD¶Ï·Ö×é3õê¼»ˉ
NVIC_InitStructure.NVIC_IRQChannel = TIM1_CC_IRQn; //TIM1ÖD¶Ï
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQí¨μà±»ê1Äü
NVIC_InitStructure.NVIC_IRQChannelPriority = 0;
NVIC_Init(&NVIC_InitStructure); //¸ù¾YNVIC_InitStructÖDÖ¸¶¨μÄ2Îêy3õê¼»ˉíaéèNVIC¼Ä′æÆ÷
TIM_ITConfig(TIM1,TIM_IT_Update|TIM_IT_CC2,ENABLE);//ÔêDí¸üDÂÖD¶Ï ,ÔêDíCC1IE2¶»ñÖD¶Ï //zz
TIM_SetCounter(TIM1, 0);
TIM_Cmd(TIM1,ENABLE ); //ê1Äü¶¨ê±Æ÷3
}
u8 TIM1CH2_CAPTURE_STA=0; //êäèë2¶»ñ×′ì¬
u16 TIM1CH2_CAPTURE_VAL; //êäèë2¶»ñÖμ
void TIM1_CC_IRQHandler(void) //TIM3ÖD¶Ï
{
if (TIM_GetITStatus(TIM1, TIM_IT_CC2) != RESET)//捕获事件发生
{
if(FlagCount==0) //开机后第一次进去捕获,用于同步时间
{
GPIOC->ODR ^= 0x4000; //每次进去捕获中断 电平翻转 用于示波器监控
TIM_Cmd(TIM3,ENABLE); //在该状态位开启小脉冲计数时钟,同步开启时间
FlagCount = 1;
times ++; //
}else if(FlagCount==1)
{
//count++;
if(times == 24) //24个PG信号为一圈,消灭边缘效应
{
TIM_Cmd(TIM3,DISABLE); //
TTT = count; //
count = 0;
FlagCount = 0;
times = 0; //
}else
{
times++;
}
}
}
TIM_ClearITPendingBit(TIM1, TIM_IT_CC2|TIM_IT_Update); //Çå3yÖD¶Ï±ê־λ //zz
}
/*
***********************************************************
*
* TIM3 óÃóú¼Æêy
*
***********************************************************
*/
void TIM3_Init(u16 arr,u16 psc)
{
NVIC_InitTypeDef NVIC_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
TIM_TimeBaseInitStructure.TIM_Period = arr;
TIM_TimeBaseInitStructure.TIM_Prescaler =psc;
TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStructure);
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE );
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
TIM_Cmd(TIM3, DISABLE);
}
void TIM3_IRQHandler(void)
{
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
{
count++; //×÷Îaò»¸ö¾Ö2¿±äá¿£¬Ã¿′νøèëÖD¶Ïoó½øDD¼ó12ù×÷
}
TIM_ClearITPendingBit(TIM3, TIM_IT_Update );
GPIOC->ODR ^= 0x8000;
}[/mw_shl_code]
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
{
extern u8 TIM1CH2_CAPTURE_STA; //êäèë2¶»ñ×′ì¬
extern u16 TIM1CH2_CAPTURE_VAL; //êäèë2¶»ñÖμ
extern u32 SpeedValue,times,TTT,FlagCount;
u8 t,len;
//u16 times;
HAL_LEDInit();
delay_init();
uart_init(115200);
TIM1_CH2_Init(0xffff,4799);
TIM3_Init(7,47);
TIM14_Init(200,47);
hc595_Init();
while(1)
{
SpeedValue = 30000000/TTT;
//printf("Times£o%d ",SpeedValue);
delay_ms(500);
}[/mw_shl_code]
主程序就做了初始化,然后就是之前通过 语句 TTT=count得到了,捕获24个脉冲得到的小脉冲TIM3的次数,小脉冲溢出时间设置为8us,方便计算,这样误差基本在一到两个小脉冲以内 速度 计算就不多说了 根据电机而异。24个捕获脉冲的时间等于(TTT*8)us
一周热门 更多>