新手上路
- 积分
- 22
- 金钱
- 22
- 注册时间
- 2017-12-19
- 在线时间
- 4 小时
|
1金钱
我现在用STM32F101C8 TIM3 1通道的定时器 产生PWM 能过上位机来修改PWM的频率 较高频率时有输出 但发现不正常 象是一直在配置 比如1K 较低频率时 比如50HZ 则没有输出 只能抓到一些脉冲 当我在配置完后加较大的延迟 则会有输出 频率也对 但好象也在一直配置刷新 我直接贴代码 麻烦大家看看 原子也看看 求教
int main(void)
{
RCC_Configuration(); //éèÖÃÏμí3ê±ÖóÎa72MHZ(Õa¸ö¿éòÔ¸ù¾YDèòa¸Ä)
NVIC_Configuration(); //STM32ÖD¶ÏÏò῱íÅäÅäÖÃ
delay_init();
// NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); //éèÖÃNVICÖD¶Ï·Ö×é2:2λÇàÕ¼óÅÏè¼¶£¬2λÏìó|óÅÏè¼¶
RS422_Init(115200);
// delay_ms(1);
PD_Init();
EB_Init();
DIR_Init();
DETECT_1_Init();
DETECT_2_Init();
TIM3_PWM_Init(2500,144-1); //2úéú20KHz μÄ WM
TIM_SetCompare1(TIM3,1250); //Õ¼¿Õ±è¿ØÖÆ
TIM_Cmd(TIM3,ENABLE);
while (1)
{
DATA_CTL();
//// STATE_TEMP1 = GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14);
//// STATE_TEMP2 = GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_15);
if(ts_buf[1] == 0x01)
GPIO_ResetBits(GPIOA,GPIO_Pin_1);
if (ts_buf[2] == 0x01)
GPIO_SetBits(GPIOA,GPIO_Pin_1);
if (ts_buf[3] == 0x01)
GPIO_SetBits(GPIOA,GPIO_Pin_2);
if (ts_buf[3] == 0x02)
GPIO_ResetBits(GPIOA,GPIO_Pin_2);
if(ts_buf[4] == 0x01)
{
STATE_TEMP1 = GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14);
STATE_TEMP2 = GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_15);
if(STATE_TEMP1 == 0)
GPIO_SetBits(GPIOA,GPIO_Pin_1);
if(STATE_TEMP2 == 0)
GPIO_ResetBits(GPIOA,GPIO_Pin_2);
if(STATE_TEMP1 == 1)
GPIO_ResetBits(GPIOA,GPIO_Pin_1);
if(STATE_TEMP2 == 1)
GPIO_ResetBits(GPIOA,GPIO_Pin_2);
}
//
fre_1 = ts_buf[5];
fre_2 = ts_buf[6];
fre_3 = ts_buf[7];
data_mid = ((u32)fre_1 << 16) | ((u32)fre_2 << 8) | ((u32)fre_3);
//
// delay_ms(10);
fre_set = (u16)(0x3D090 / data_mid);
fre_set_1 = fre_set;
fre_zkb = (u16)(fre_set/2);
fre_zkb_1 = fre_zkb;
// SetValue1(fre_zkb_1,fre_set_1);
// // delay_ms(100);
// //TIM_SetAutoreload(TIM3,fre_set);
TIM3_PWM_Init(fre_set_1-1,144-1); //2úéú20KHz μÄ WM
//delay_ms(10);
TIM_SetCompare1(TIM3,fre_zkb_1); //Õ¼¿Õ±è¿ØÖÆ
delay_ms(2000);
// TIM_Cmd(TIM3,DISABLE);
//
// if(STATE_TEMP1 == 0)
// GPIO_SetBits(GPIOA,GPIO_Pin_2);
// if(STATE_TEMP2 == 0)
// GPIO_ResetBits(GPIOA,GPIO_Pin_2);
// delay_ms(1000);
}
}
void DATA_CTL(void)
{
u8 *p;
u8 a = 7;
p = &a;
// delay_ms(300);
RS422_Receive_Data(rs_buf, p);
if((rs_buf[0] == 0x0a)&&(rs_buf[8] == 0x0b))
{
ts_buf[0] = rs_buf[0];
ts_buf[1] = rs_buf[1];
ts_buf[2] = rs_buf[2];
ts_buf[3] = rs_buf[3];
ts_buf[4] = rs_buf[4];
ts_buf[5] = rs_buf[5];
ts_buf[6] = rs_buf[6];
ts_buf[7] = rs_buf[7];
ts_buf[8] = rs_buf[8];
}
else
{
ts_buf[0] = 0;
ts_buf[1] = 0;
ts_buf[2] = 0;
ts_buf[3] = 0;
ts_buf[4] = 0;
ts_buf[5] = 0;
ts_buf[6] = 0;
ts_buf[7] = 0;
ts_buf[8] = 0;
}
}
下面是TIM的配置
void TIM3_PWM_Init(u16 arr,u16 psc)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
// TIM_DeInit(TIM3);
// TIM_InternalClockConfig(TIM3);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //ê1Äü¶¨ê±Æ÷3ê±Öó
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE); //ê1ÄüGPIOíaéèoíAFIO¸′óÃ1|ÄüÄ£¿éê±Öó
//TIM_InternalClockConfig(TIM3);
//GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); //Timer32¿·ÖÖØó3éä TIM3_CH2-> B5
//éèÖøÃòy½ÅÎa¸′óÃêä3ö1|Äü,êä3öTIM3 CH2μÄ WMÂö3å2¨DÎ GPIOB.5
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; //TIM_CH2
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //¸′óÃíÆíìêä3ö
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);//3õê¼»ˉGPIO
// GPIO_SetBits(GPIOA,GPIO_Pin_7);
//3õê¼»ˉTIM3
TIM_TimeBaseStructure.TIM_Period = arr; //éèÖÃÔúÏÂò»¸ö¸üDÂê¼t×°èë»î¶ˉμÄ×Ô¶ˉÖØ×°ÔØ¼Ä′æÆ÷ÖüÆúμÄÖμ
TIM_TimeBaseStructure.TIM_Prescaler =psc; //éèÖÃóÃà′×÷ÎaTIMxê±ÖóÆμÂê3yêyμÄÔ¤·ÖÆμÖμ
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //éèÖÃê±Öó·Ö¸î:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIMÏòéϼÆêyÄ£ê½
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //¸ù¾YTIM_TimeBaseInitStructÖDÖ¸¶¨μÄ2Îêy3õê¼»ˉTIMxμÄê±¼ä»ùêyμ¥λ
//3õê¼»ˉTIM3 Channel2 PWMÄ£ê½
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //Ñ¡Ôñ¶¨ê±Æ÷Ä£ê½:TIMÂö3å¿í¶èμ÷ÖÆÄ£ê½2
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //±è½Ïêä3öê1Äü
TIM_OCInitStructure.TIM_Pulse = 0;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //êä3ö¼«DÔ:TIMêä3ö±è½Ï¼«DÔ¸ß
TIM_OC1Init(TIM3, &TIM_OCInitStructure); //¸ù¾YTÖ¸¶¨μÄ2Îêy3õê¼»ˉíaéèTIM3 OC2
TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable); //ê1ÄüTIM3ÔúCCR2éÏμÄÔ¤×°ÔØ¼Ä′æÆ÷
TIM_ARRPreloadConfig(TIM3, ENABLE);
//TIM_CtrlPWMOutputs(TIM3,ENABLE);
//TIM_GenerateEvent(TIM3,TIM_EventSource_Update);
TIM_Cmd(TIM3, ENABLE); //ê1ÄüTIM3
}
//void SetValue1(u16 g,u16 arr)
//{
// //¸ù¾YÑÕé«ÖμDT¸Ä¶¨ê±Æ÷μıè½Ï¼Ä′æÆ÷Öμ
//
// TIM3->CCR1 = g;
// TIM3->ARR = arr;
//
//}
//¶¨ê±Æ÷3ÖD¶Ï·tÎñoˉêy
void TIM3_IRQHandler(void)
{
if(TIM_GetITStatus(TIM3,TIM_IT_Update)==SET) //òç3öÖD¶Ï
{
// PWM=!PWM;
}
TIM_ClearITPendingBit(TIM3,TIM_IT_Update); //Çå3yÖD¶Ï±ê־λ
}
|
|