OpenEdv-开源电子网

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

新人求助

[复制链接]

3

主题

5

帖子

0

精华

新手入门

积分
6
金钱
6
注册时间
2017-2-1
在线时间
6 小时
发表于 2017-2-5 19:57:24 | 显示全部楼层 |阅读模式
10金钱
现正在使用mini stm32f103rct单片机,希望完成对于小车的控制,个人理解需要输出8路pwm
出现了如下的问题:
完成不了对于端口的映射,无法输出pwm信号,希望能够给提供一个类似的程序参考一下
同时处于连接稳定性的要求,个人认为杜邦线并不适用,想使用类似接线端子的连接装置
希望做过类似的项目的大佬们能够提供一些指导

最佳答案

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

#include "timer.h" #include "led.h" #include "usart.h" void TIM3_PWM_Init(u16 arr,u16 psc) { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //使能定时器3时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | R ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

14

主题

45

帖子

0

精华

初级会员

Rank: 2

积分
118
金钱
118
注册时间
2016-8-5
在线时间
22 小时
发表于 2017-2-5 19:57:25 | 显示全部楼层
#include "timer.h"
#include "led.h"
#include "usart.h"

void TIM3_PWM_Init(u16 arr,u16 psc)
{  
        GPIO_InitTypeDef GPIO_InitStructure;
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        TIM_OCInitTypeDef  TIM_OCInitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
       

        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);        //使能定时器3时钟
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC  | RCC_APB2Periph_AFIO , ENABLE);  //使能GPIO外设和AFIO复用功能模块时钟
        GPIO_PinRemapConfig(GPIO_FullRemap_TIM3, ENABLE); //Timer3部分重映射  TIM3_CH2->PB5   

   //设置该引脚为复用输出功能,输出TIM3 CH2的PWM脉冲波形        GPIOB.5
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化GPIO

        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的时间基数单位
        TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE );
       
        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寄存器
       
       
        //初始化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_OC2Init(TIM3, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM3 OC2
        TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);  //使能TIM3在CCR2上的预装载寄存器
       
        TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;
        TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;
        TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_Low;
  TIM_OC1Init(TIM3, &TIM_OCInitStructure);
        TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);
       
        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_OC3Init(TIM3, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM3 OC2
        TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable);  //使能TIM3在CCR2上的预装载寄存器

        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_OC4Init(TIM3, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM3 OC2
        TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Enable);  //使能TIM3在CCR2上的预装载寄存器
       
       
TIM_Cmd(TIM3, ENABLE);  //使能TIM3
       

}
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;
                }
}
[/mw_shl_code]
回复

使用道具 举报

14

主题

45

帖子

0

精华

初级会员

Rank: 2

积分
118
金钱
118
注册时间
2016-8-5
在线时间
22 小时
发表于 2017-2-5 23:39:32 | 显示全部楼层
jasonflash 发表于 2017-2-5 23:34
#include "timer.h"
#include "led.h"
#include "usart.h"

这是我当初搞车子时对原子代码的小小修改,因为我的板子恰好PC6、7、8、9在一排且满足定时器要求,所以就使用了一个4排的接线连在了开发板排针和电机驱动上面。main文件里面还有一个设置占空比的函数,想调速的话就调节占空比,调用TIM_SetComparex(),就可以了。不过我有些好奇,你输出8路的pwm是做什么用的。四轮小车(无舵机)我觉得4路就够了。
回复

使用道具 举报

3

主题

5

帖子

0

精华

新手入门

积分
6
金钱
6
注册时间
2017-2-1
在线时间
6 小时
 楼主| 发表于 2017-2-6 11:56:33 | 显示全部楼层
jasonflash 发表于 2017-2-5 23:39
这是我当初搞车子时对原子代码的小小修改,因为我的板子恰好PC6、7、8、9在一排且满足定时器要求,所以就 ...

额,难道不是一路前进,一路倒退吗,难道我的理解有问题吗。。
回复

使用道具 举报

3

主题

5

帖子

0

精华

新手入门

积分
6
金钱
6
注册时间
2017-2-1
在线时间
6 小时
 楼主| 发表于 2017-2-6 12:25:15 | 显示全部楼层
seufwh 发表于 2017-2-6 11:56
额,难道不是一路前进,一路倒退吗,难道我的理解有问题吗。。

额,想了想好像是我的 想法有问题
回复

使用道具 举报

14

主题

45

帖子

0

精华

初级会员

Rank: 2

积分
118
金钱
118
注册时间
2016-8-5
在线时间
22 小时
发表于 2017-2-6 12:31:47 | 显示全部楼层
seufwh 发表于 2017-2-6 12:25
额,想了想好像是我的 想法有问题

pwm只和速度有关系,具体的前进、倒退、刹车你应该看看你买的电机驱动的逻辑列表,跟某些引脚的电平有关。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-16 23:16

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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