中级会员
 
- 积分
- 224
- 金钱
- 224
- 注册时间
- 2015-9-5
- 在线时间
- 48 小时
|
1金钱
最近在做一个需要pwm输出的电机,代码如下,使用外部中断设置PE.2和PE.3分别是输入的加速减速信号,用TIM2的CH3通道输出pwm信号,但是为什么没有输出信号?小弟新手,是在找不出问题在哪了。。。求大神助攻。
代码如下:
#include <stm32f10x.h>
#include <delay.h> //ΪʲôҪ°üº¬Í·ÎļþÄØ£¿ÒòΪÀïÃæÓÐÒªÓõĺ¯ÊýÉêÃ÷£¬º¯ÊýΪʲôҪÉêÃ÷ÄØ£¿ÒòΪҪ·ÖÅäÄÚ´æµ¥Ôª°¡¡£¡£
#include <sys.h> //PBÒªÓᢠBout(x)¡¢ Bin(x)¡¢ÓÃÆðÀ´»á·Ç³£·½±ã
#include <stdio.h>
void RCC_Configuration(void);
void Pwm_Configuration(void);
void NVIC_Configuration(void);
void HellIo_Configuration(void);
void USART1_Configuration(void);
s16 speed=2;//speedµµµÄÖµ£¬speed=(0,1,2,3,4,5)³õʼֵΪ2
s16 com=720;
s16 comnow=900;
int main()
{
s16 num=0;//²îÖµ
while(1){
switch(speed){
case 0:com=900;
break;
case 1:com=720;
break;
case 2:com=540;
break;
case 3:com=360;
break;
case 4:com=180;
break;
case 5:com=0;
break;
}
num = com-comnow;
if(num==0){
comnow = comnow;
}else if(num>0){
comnow = comnow + 45;
}else {
comnow = comnow - 45;
}
TIM_SetCompare3(TIM2,comnow);
}
}
void RCC_Configuration(void)
{
/* SYSCLK, HCLK, PCLK2 and PCLK1 configuration -----------------------------*/
RCC_DeInit();
//RCC_HSEConfig(RCC_HSE_ON);
//HSEStartUpStatus = RCC_WaitForHSEStartUp();
/* Enable Prefetch Buffer */
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);//ʹÄÜ»º³å
/* Flash 2 wait state */
FLASH_SetLatency(FLASH_Latency_2);//cupµÄÔËÐÐÆµÂʸߣ¬¶øÄÚ²¿flashµÄÔËÐÐÆµÂʵͣ¬ËùÒÔcpuÒª´ÓflashÖÐȡָÁȻҪÓиöµÈ´ýµÄʱ¼äÁË¡£
/* HCLK = SYSCLK */
RCC_HCLKConfig(RCC_SYSCLK_Div1);
/* PCLK2 = HCLK */
RCC_PCLK2Config(RCC_HCLK_Div1);
/* PCLK1 = HCLK/2 */
RCC_PCLK1Config(RCC_HCLK_Div2);
/* PLLCLK = 8MHz * 9 = 72 MHz */
RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_16);
/* Enable PLL */
RCC_PLLCmd(ENABLE);//±¶ÆµÊ¹ÄÜ
while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
{
}
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
while(RCC_GetSYSCLKSource() != 0x08)
{
}
/*elseÕâ¶Î´úÂë×öµÃºÜÖܵ½£¬¿ÉÒÔ¼Ó¸ö·äÃùÆ÷ÌáʾʲôµÄ*/
//ÒÔºó¿ªÆôÍâÉèʱÖÓ¾ÍÔÚÕâ¿é¿ª£¡£¡£¡
//¿ªÆôGPIOʱÖÓ
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
//RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
}
void NVIC_Configuration(void)
{
EXTI_InitTypeDef EXTI_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//ÍⲿÖжϣ¬ÐèҪʹÄÜAFIOʱÖÓ
//GPIOE.2 ÖжÏÏßÒÔ¼°Öжϳõʼ»¯ÅäÖÃ
GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource2);
EXTI_InitStructure.EXTI_Line=EXTI_Line2;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;//ÉÏÉýÑØ´¥·¢
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure); //¸ù¾ÝEXTI_InitStructÖÐÖ¸¶¨µÄ²ÎÊý³õʼ»¯ÍâÉèEXTI¼Ä´æÆ÷
//GPIOE.3 ÖжÏÏßÒÔ¼°Öжϳõʼ»¯ÅäÖÃ
GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource3);
EXTI_InitStructure.EXTI_Line=EXTI_Line3;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;//ÉÏÉýÑØ´¥·¢
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure); //¸ù¾ÝEXTI_InitStructÖÐÖ¸¶¨µÄ²ÎÊý³õʼ»¯ÍâÉèEXTI¼Ä´æÆ÷
NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn; //ʹÄܰ´¼üËùÔÚµÄÍⲿÖжÏͨµÀ
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //ÇÀÕ¼ÓÅÏȼ¶2
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01; //×ÓÓÅÏȼ¶1
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //ʹÄÜÍⲿÖжÏͨµÀ
NVIC_Init(&NVIC_InitStructure); //¸ù¾ÝNVIC_InitStructÖÐÖ¸¶¨µÄ²ÎÊý³õʼ»¯ÍâÉèNVIC¼Ä´æÆ÷
NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn; //ʹÄܰ´¼üËùÔÚµÄÍⲿÖжÏͨµÀ
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //ÇÀÕ¼ÓÅÏȼ¶2
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01; //×ÓÓÅÏȼ¶1
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //ʹÄÜÍⲿÖжÏͨµÀ
NVIC_Init(&NVIC_InitStructure); //¸ù¾ÝNVIC_InitStructÖÐÖ¸¶¨µÄ²ÎÊý³õʼ»¯ÍâÉèNVIC¼Ä´æÆ÷
}
void EXTI2_IRQHandler(void)//ÊÕµ½¼ÓËÙÐźź󣬽øÐд¦Àí£¬Î´Ð´
{
delay_ms(10); //Ïû¶¶
if(1<=speed<=5){
speed++;
}
}
void EXTI3_IRQHandler(void) //ÊÕµ½¼õËÙÐźź󣬽øÐд¦Àí£¬Î´Ð´
{
delay_ms(10); //Ïû¶¶
if(1<=speed<=5){
speed--;
}
}
void HellIo_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//ʹÄÜ ORTBʱÖÓ
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);//¹Ø±Õjtag£¬Ê¹ÄÜSWD£¬¿ÉÒÔÓÃSWDģʽµ÷ÊÔ
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;//PA15
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //ÉèÖóÉÉÏÀ­ÊäÈë
GPIO_Init(GPIOE, &GPIO_InitStructure);//³õʼ»¯GPIOE2
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;//PA15
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //ÉèÖóÉÉÏÀ­ÊäÈë
GPIO_Init(GPIOE, &GPIO_InitStructure);//³õʼ»¯GPIOE3
}
//num:Ô¤×°ÔØÖµ£¬fpz£ºTIMx·ÖƵֵ1~65535
void Pwm_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//ʹÄÜ ORTA,PORTCʱÖÓ
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//PIO_SetBits(GPIOA,GPIO_Pin_8); //PA.0 Êä³ö¸ß
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//GPIO_SetBits(GPIOA,GPIO_Pin_8); //PA.1 Êä³ö¸ß
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// GPIO_SetBits(GPIOA,GPIO_Pin_8); //PA.2 Êä³ö¸ß
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// GPIO_SetBits(GPIOA,GPIO_Pin_8); //PA.3 Êä³ö¸ß
//GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
//GPIO_Init(GPIOA, &GPIO_InitStructure);
// GPIO_SetBits(GPIOA,GPIO_Pin_8); //PA.4 Êä³ö¸ß
//GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
//GPIO_Init(GPIOA, &GPIO_InitStructure);
// GPIO_SetBits(GPIOA,GPIO_Pin_8); //PA.5 Êä³ö¸ß
//GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
//GPIO_Init(GPIOA, &GPIO_InitStructure);
// GPIO_SetBits(GPIOA,GPIO_Pin_8); //PA.6 Êä³ö¸ß
//GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
//GPIO_Init(GPIOA, &GPIO_InitStructure);
// GPIO_SetBits(GPIOA,GPIO_Pin_8); //PA.7 Êä³ö¸ß
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
TIM_TimeBaseStructure.TIM_Period = 900; //ÉèÖÃÔÚÏÂÒ»¸ö¸üÐÂʼþ×°Èë»î¶¯µÄ×Ô¶¯ÖØ×°ÔؼĴæÆ÷ÖÜÆÚµÄÖµ //²ÎÊý±ØÐëÊÇ0x0000 and 0xFFFF£¬¡¾¼ÆÊýÆ÷Ò»¸öÖÜÆÚµÄ¼ÆÊý×ÜÊý¡¿
TIM_TimeBaseStructure.TIM_Prescaler =0; //ÉèÖÃÓÃÀ´×÷ΪTIMxʱÖÓÆµÂʳýÊýµÄÔ¤·ÖƵֵ ²»·ÖƵ¡¾ÕâЩµÄµ÷½Ú¶¼»áÓ°Ïìµ½×îºóµÄpwm²¨ÐΣ¡£¡£¡¡¿¡¾·ÖƵÖÜÆÚ±ä³¤¡¢±¶ÆµÖÜÆÚ±ä¶Ì¡¿
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //ÉèÖÃʱÖÓ·Ö¸î:TDTS = Tck_tim ¡¾¿´ÆðÀ´²¢Ã»Ê²Ã´ÄñÓã¡£¡¡¿
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIMÏòÉϼÆÊýģʽ
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //¸ù¾ÝTIM_TimeBaseInitStructÖÐÖ¸¶¨µÄ²ÎÊý³õʼ»¯TIMxµÄʱ¼ä»ùÊýµ¥Î»¡¾ÕæÕýÆð×÷Óõijõʼ»¯£¡£¡Ê±»ùµ¥Ôª£¡£¡£¡¡¿
/* Output Compare Active Mode configuration: Channel1 */
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //Ñ¡Ôñ¶¨Ê±Æ÷ģʽ:TIMÂö³å¿í¶Èµ÷ÖÆÄ£Ê½2
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //±È½ÏÊä³öʹÄÜ
TIM_OCInitStructure.TIM_Pulse = 0; //ÉèÖôý×°Èë²¶»ñ±È½Ï¼Ä´æÆ÷µÄÂö³åÖµ
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //Êä³ö¼«ÐÔ:TIMÊä³ö±È½Ï¼«ÐÔµÍ
TIM_OC1Init(TIM2, &TIM_OCInitStructure); //¸ù¾ÝTIM_OCInitStructÖÐÖ¸¶¨µÄ²ÎÊý³õʼ»¯ÍâÉèTIMx ¡¾TIM_OC3Init˵Ã÷Ñ¡ÔñµÄÊÇchannel3¡¿Í¨µÀ1
TIM_OC2Init(TIM2, &TIM_OCInitStructure); //¸ù¾ÝTIM_OCInitStructÖÐÖ¸¶¨µÄ²ÎÊý³õʼ»¯ÍâÉèTIMx ¡¾TIM_OC3Init˵Ã÷Ñ¡ÔñµÄÊÇchannel3¡¿Í¨µÀ2
TIM_OC3Init(TIM2, &TIM_OCInitStructure); //¸ù¾ÝTIM_OCInitStructÖÐÖ¸¶¨µÄ²ÎÊý³õʼ»¯ÍâÉèTIMx ¡¾TIM_OC3Init˵Ã÷Ñ¡ÔñµÄÊÇchannel3¡¿Í¨µÀ3
TIM_OC4Init(TIM2, &TIM_OCInitStructure); //¸ù¾ÝTIM_OCInitStructÖÐÖ¸¶¨µÄ²ÎÊý³õʼ»¯ÍâÉèTIMx ¡¾TIM_OC3Init˵Ã÷Ñ¡ÔñµÄÊÇchannel3¡¿Í¨µÀ4
TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable); //ʹÄÜTIMxÔÚCCR3ÉϵÄÔ¤×°ÔØ¼Ä´æÆ÷¡¾Ô¤×°ÔØ£¡£¡¡¿
TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable);//
TIM_OC3PreloadConfig(TIM2, TIM_OCPreload_Enable);
TIM_OC4PreloadConfig(TIM2, TIM_OCPreload_Enable);
TIM_ARRPreloadConfig(TIM2, ENABLE); //ʹÄÜTIMxÔÚARRÉϵÄÔ¤×°ÔØ¼Ä´æÆ÷¡¾Ô¤×°ÔؼĴæÆ÷ºÍÓ°×ӼĴæÆ÷ÏëÏàͨ¿
TIM_Cmd(TIM2, ENABLE); //ʹÄÜTIM1
}
|
|