OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3661|回复: 8

想用TIM3的通道1和2做PWM输出,但是有问题,没有输出电压

[复制链接]

3

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
73
金钱
73
注册时间
2016-4-21
在线时间
23 小时
发表于 2016-4-21 14:05:28 | 显示全部楼层 |阅读模式
1金钱
      希望大神可以帮忙看看哪里有问题,自己看半天了,也搜过类似问题的,试过了也不好使

int main(void)
{
   u8 led_fx;          //定义的变量名称led_fx(方向)
   u16 led_dt;  //随意定义的变量名称

   RCC_Configuration();        //系统时钟初始化
   GPIO_Configuration();//端口初始化
   TIM3_Configuration();//定时器和PWM初始化          

        while(1)
        {
                 //每10ms改变一次CCRx的值,太快肉眼看不出效果
                for(led_fx=3000;led_fx>=0;led_fx--)//=1为从左到右
                {
                                               
                        if(1500<led_dt<300)
                        {
                                GPIO_SetBits(GPIOB,GPIO_Pin_5);
                                GPIO_ResetBits(GPIOB,GPIO_Pin_4);
                                delay_ms(10);
                                if(2700<led_fx<3000)
                                led_dt=100;          //不断增加,在ppt图中表示高电平所占时间增加
                                else if(2400<led_fx<2700)
                                led_dt=200;
                                else if(2100<led_fx<2400)
                                led_dt=300;
                                else if(1800<led_fx<2100)
                                led_dt=200;
                                else if(1500<led_fx<1800)
                                led_dt=100;
                                else
                                {
                               
                                }
                        }
                        else
                        {
                                GPIO_ResetBits(GPIOB,GPIO_Pin_5);
                                GPIO_SetBits(GPIOB,GPIO_Pin_4);
                                delay_ms(10);
                                if(1200<led_fx<1500)
                                led_dt=100;
                                else if(900<led_fx<1200)
                                led_dt=200;
                                else if(600<led_fx<900)
                                led_dt=300;
                                else if(300<led_fx<600)
                                led_dt=200;
                                else if(0<led_fx<300)
                                led_dt=100;
                                else
                                {
                               
                                }
                        }
                }       



                TIM_SetCompare2(TIM3,led_dt);//把变量的值送到PWM的CCRx里去,因为是通道2,定时器3
                TIM_SetCompare1(TIM3,led_dt);
        }       
}

void RCC_Configuration(void)
{
    SystemInit();
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
}

void GPIO_Configuration(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;//定义结构体       
        //LED初始化
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;
        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;                 
        GPIO_Init(GPIOB,&GPIO_InitStructure);

        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4;
        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;                 
        GPIO_Init(GPIOB,&GPIO_InitStructure);


}


void TIM3_Configuration(void)
{
        TIM_TimeBaseInitTypeDef TIM_TimeBaseStruct;
        TIM_OCInitTypeDef TIM_OCInitStructure;
       
        GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3,ENABLE);           //端口映射,在中文手册119页,看到用通道2的部分映射可以是输出在PB5端口
        //GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);//加上了这一句,禁用JTAG,我用的是JTAG下载

        //定时器初始化
        TIM_TimeBaseStruct.TIM_Period = 899;   //初值,等于72000000/36000=2000
        TIM_TimeBaseStruct.TIM_Prescaler = 0;        //预分频。注意,此步会把你输入的数字加1,所以如果需要10,就输入9
        TIM_TimeBaseStruct.TIM_ClockDivision = 0;
        TIM_TimeBaseStruct.TIM_CounterMode = TIM_CounterMode_Up;         //向上
        TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStruct);



        //PWM初始化
        TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;
        TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;        //使能位,不然比较完不输出
        TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;//使用Low因为看LED原理图,一边接的3.3V,所以要用low

        TIM_OC2Init(TIM3,&TIM_OCInitStructure);
        TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable);//使能在CCR上的预装载寄存器,不然执行一次后可能停止
       
        TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;
        TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;        //使能位,不然比较完不输出
        TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;
       
        TIM_OC1Init(TIM3,&TIM_OCInitStructure);
        TIM_OC1PreloadConfig(TIM3,TIM_OCPreload_Enable);
       
        TIM_Cmd(TIM3,ENABLE);                                           //打开外设
}
@正点原子

最佳答案

查看完整内容[请看2#楼]

要先开复用时钟!!论坛很多例子,搜索自己参考下就解决了。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2016-4-21 14:05:29 | 显示全部楼层
要先开复用时钟!!论坛很多例子,搜索自己参考下就解决了。
回复

使用道具 举报

28

主题

303

帖子

0

精华

高级会员

Rank: 4

积分
541
金钱
541
注册时间
2014-8-14
在线时间
67 小时
发表于 2016-4-21 21:41:28 | 显示全部楼层
GPIO_ResetBits(GPIOB,GPIO_Pin_5);
GPIO_SetBits(GPIOB,GPIO_Pin_4);  //有啥用
这个世界上还有很多很多的人,但你不认识他们,他们也不属于你的世界。这个世界上还有很多好吃的好玩的好看的东西,可真正属于你的世界其实是很小的,只是你去过的地方吃过的东西和见过的落日,还有会在乎你死活的朋友。”——《龙族》
回复

使用道具 举报

28

主题

303

帖子

0

精华

高级会员

Rank: 4

积分
541
金钱
541
注册时间
2014-8-14
在线时间
67 小时
发表于 2016-4-21 22:05:14 | 显示全部楼层
大哥     if(1500<led_dt<300)  请你用优雅的声音  大声诵读十遍
另外  请把 u16 led_dt;    给一个初值  好吗??请问  3000*10ms  是多少30s  你30秒才会进入  TIM_SetCompare1(TIM3,led_dt);  这个函数
另外我参照  原子哥的程序  给你加了一句
TIM_ARRPreloadConfig(TIM3, ENABLE);  //Lee
有问题再给我留言
记得问问题的时候要把代码  写清楚了问  你的时间 我的时间都很宝贵
捕获.JPG
这个世界上还有很多很多的人,但你不认识他们,他们也不属于你的世界。这个世界上还有很多好吃的好玩的好看的东西,可真正属于你的世界其实是很小的,只是你去过的地方吃过的东西和见过的落日,还有会在乎你死活的朋友。”——《龙族》
回复

使用道具 举报

3

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
73
金钱
73
注册时间
2016-4-21
在线时间
23 小时
 楼主| 发表于 2016-4-22 17:19:10 | 显示全部楼层

谢谢提醒。我重新写了个让电机正转的程序,l298n的IN1接的PB4,IN2接的PB5,我只映射了PB5,所以我觉得现在电机应该处于正转的情况。然后我想让电机制动,是不是应该让PB5置0,但是我不知道应该在哪里加PB5置0的程序

int main(void)
{
   
   u8 led_jj=1;
   u8 led_fx=1;          //定义的变量名称led_fx(方向)
   u16 led_dt=0;  //随意定义的变量名称

   RCC_Configuration();        //系统时钟初始化
   GPIO_Configuration();//端口初始化
   TIM3_Configuration();//定时器和PWM初始化          
   
        while(1)
        {
               
                if(led_fx==1)
                {
                       
                        delay_ms(10); //每10ms改变一次CCRx的值,太快肉眼看不出效果
                        if(led_jj==1) //=1为从左到右
                        {
                                led_dt++;          //不断增加,在ppt图中表示高电平所占时间增加
                        }
                        else
                        {
                                led_dt--;
                        }
       
                        if(led_dt>300)    led_jj=0;
                        if(led_dt==0)          led_jj=1;
       
                        TIM_SetCompare2(TIM3,led_dt);//把变量的值送到PWM的CCRx里去,因为是通道2,定时器3
                }
                else
                {
                       
                }
        }       
}

void RCC_Configuration(void)
{
    SystemInit();
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
}

void GPIO_Configuration(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;//定义结构体       
        //LED初始化
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;
        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;                 
        GPIO_Init(GPIOB,&GPIO_InitStructure);

        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4;
        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;                 
        GPIO_Init(GPIOB,&GPIO_InitStructure);

        GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);//关闭JTAG,保留SW做调试用
       
}


void TIM3_Configuration(void)
{
        TIM_TimeBaseInitTypeDef TIM_TimeBaseStruct;
        TIM_OCInitTypeDef TIM_OCInitStructure;
       
        GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3,ENABLE);           //端口映射,在中文手册119页,看到用通道2的部分映射可以是输出在PB5端口

        //定时器初始化
        TIM_TimeBaseStruct.TIM_Period = 899;   //初值,等于72000000/36000=2000
        TIM_TimeBaseStruct.TIM_Prescaler = 0;        //预分频。注意,此步会把你输入的数字加1,所以如果需要10,就输入9
        TIM_TimeBaseStruct.TIM_ClockDivision = 0;
        TIM_TimeBaseStruct.TIM_CounterMode = TIM_CounterMode_Up;         //向上
        TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStruct);



        //PWM初始化
        TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;
        TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;        //使能位,不然比较完不输出
        TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_Low;//使用Low因为看LED原理图,一边接的3.3V,所以要用low

        TIM_OC2Init(TIM3,&TIM_OCInitStructure);

        TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable);//使能在CCR上的预装载寄存器,不然执行一次后可能停止
        TIM_Cmd(TIM3,ENABLE);                                           //打开外设
}
回复

使用道具 举报

28

主题

303

帖子

0

精华

高级会员

Rank: 4

积分
541
金钱
541
注册时间
2014-8-14
在线时间
67 小时
发表于 2016-4-22 22:14:27 | 显示全部楼层
stm32毕设 发表于 2016-4-22 17:19
谢谢提醒。我重新写了个让电机正转的程序,l298n的IN1接的PB4,IN2接的PB5,我只映射了PB5,所以我觉得现 ...

哥   这个 我就不知道了  大家都要努力  加油  那个我没用过
这个世界上还有很多很多的人,但你不认识他们,他们也不属于你的世界。这个世界上还有很多好吃的好玩的好看的东西,可真正属于你的世界其实是很小的,只是你去过的地方吃过的东西和见过的落日,还有会在乎你死活的朋友。”——《龙族》
回复

使用道具 举报

3

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
73
金钱
73
注册时间
2016-4-21
在线时间
23 小时
 楼主| 发表于 2016-4-25 09:49:31 | 显示全部楼层
李少帅 发表于 2016-4-22 22:14
哥   这个 我就不知道了  大家都要努力  加油  那个我没用过

终于搞出来了,谢谢啦!
回复

使用道具 举报

3

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
73
金钱
73
注册时间
2016-4-21
在线时间
23 小时
 楼主| 发表于 2016-4-25 09:56:44 | 显示全部楼层
已经成功完成电机正反转的加减速,谢谢原子哥!
回复

使用道具 举报

2

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
141
金钱
141
注册时间
2016-5-12
在线时间
49 小时
发表于 2016-5-12 22:20:42 | 显示全部楼层
哥们  两路pwm调通了没?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-8 22:43

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表