OpenEdv-开源电子网

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

求一个TIM4 H0--H4通道发送PWM寄存器版程序

[复制链接]

3

主题

6

帖子

0

精华

初级会员

Rank: 2

积分
55
金钱
55
注册时间
2015-7-20
在线时间
8 小时
发表于 2016-10-26 22:57:09 | 显示全部楼层 |阅读模式
1金钱
求一个TIM4 H0--H4通道发送PWM寄存器版程序,小弟在这先谢谢各位了

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2016-10-27 21:59:52 | 显示全部楼层
自己写,什么都想别人帮你搞,这种思路就不对啊。
回复

使用道具 举报

3

主题

6

帖子

0

精华

初级会员

Rank: 2

积分
55
金钱
55
注册时间
2015-7-20
在线时间
8 小时
 楼主| 发表于 2016-11-4 09:54:44 | 显示全部楼层
#include "pwm.h"
#include "sys.h"
#include "timer.h"
#include "led.h"
#include "filter.h"

#define Dir_R1 PBout(2)     //电机R1 方向
#define Dir_R2 PBout(3)     //电机R2 方向
#define Dir_L1 PBout(4)     //电机L1 方向
#define Dir_L2 PBout(5)     //电机L2 方向


//定义变量
int   Absolute_Cont2=0,Absolute_Cont3=0;        //编码盘计数器绝对值
float Absolute_Speed=0;                                //编码盘速度绝对值
float Speed=0,Position=0;                        //速度和位置
//char Speed_need=0;                                //速度增量
//char turn_need=0;                                //转向变量       
               
/******************************************/

//函数声明



/******************************************/

//TIM3 PWM部分初始化
//PWM 输出初始化端口(PB0,PB1)
//arr:自动重装值
//psc:时钟预分频数
void TIM3_PWM_Init(u16 arr,u16 psc)

{
       
        RCC->APB1ENR|=1<<1;                          //TIM3 时钟使能,T3在APB1的1位
        RCC->APB2ENR|=1<<3;                                //IOPBEN='1' 使能PORT B端口时钟
        GPIOB->CRL&=0XFFFFFF00;                                        //设置PB0端口,为R脉冲发送口,PB1端口,为L脉冲发送口               
        GPIOB->CRL|=0X000000BB;         //设置PB0/PB1端口为复用功能推挽输出模式
        RCC->APB2ENR|=1<<0;                                                        //开启辅助时钟,AFIO复用时钟使能
       
        GPIOB->CRL&=0XFF0000FF;         //设置PB2,PB3端口,决定R电机方向,PB4,PB5端口,决定L电机方向       
        GPIOB->CRL|=0XFF3333FF;                //设置PB2,PB3,PB4,PB5端口为通用功能推挽输出模式
       
        TIM3->ARR=arr;                        //设定计数器自动中装值
        TIM3->PSC=psc;                        //预分频器7200分频

        TIM3->CCMR2|=6<<4;                //CH3 OC3M='110' 设定为 PWM1 模式 释义(是从0左移4位,6二进制是110,即是PWM1 模式)
        TIM3->CCMR2|=1<<3;                 //CH3 OC3PE='1'开启预装使能
       
        TIM3->CCMR2|=6<<12;         //CH4 设定为 PWM1 模式 释义(是从0左移12位,6二进制是110,即是PWM1 模式)
        TIM3->CCMR2|=1<<11;                //CH4 开启预装使能

        TIM3->CCER|=1<<8;                 //OC3 输出使能
        TIM3->CCER|=1<<12;                //OC4 输出使能

        TIM3->BDTR |= 1<<15;                //输出主使能

        TIM3->CR1|=0x0080;                //ARPE 预装使能
        TIM3->EGR |=1<<0;                //UG 设置更新                       
        TIM3->CR1|=0x0001;                //CEN 使能定时器 3
}
/******************************************/

//        R编码器 TIM4_Coder 部分配置CH1-CH2
void TIM4_Coder_R_Init(void)
{
        RCC->APB1ENR|=1<<2;                //TIM4 时钟使能,T4在APB1的2位
        RCC->APB2ENR|=1<<3;                //IOPBEN='1' 使能PORT B端口时钟
        RCC->APB2ENR|=1<<0;                //开启辅助时钟,AFIO复用时钟使能

        GPIOB->CRL&=0X00FFFFFF;                //PB6/PB7,作为R编码器的AB相输入端口
        GPIOB->CRL|=0X44000000;                //PB6/PB7,设置为浮空输入

        TIM4->PSC = 0x00;                //预分频器
        TIM4->ARR = ENCODER_TIM_PERIOD-1;//设定计数器自动重装值
        TIM4->CR1 &=~(3<<5);                //选择计数模式:边沿对齐模式

        TIM4->CCMR1 |= 1<<0;                //CC1S='01'通道配置为输入,IC1FP1映射在TI1
        TIM4->CCMR1 |= 1<<8;                 //CC2S='01'通道配置为输入,IC2FP2映射在TI2
        TIM4->CCMR1 |= 3<<4;                //IC1F=0011,配置输入滤波器
        TIM4->CCER &= ~(1<<1);                //CC1P取反='0' IC1FP1不反相 IC1FP1=TI1
        TIM4->CCER &= ~(1<<5);                //CC2P取反='0' IC2FP2不反相 IC2FP1=TI2

        TIM4->SMCR |= 3<<0;                //SMS='011'设置编码器模式3,计时器在TI1FP1和TI2FP2的边沿向上/向下计数(上升沿,和下降沿有效)                                                               
        TIM4->CNT = COUNTER_RESET;        //设定计数器初始值为32767
        TIM4->CR1 |= 0x01;                //CEN='1'使能计数器

}
/******************************************/

//          L编码器 TIM4_Coder 部分配置CH3-CH4
void TIM4_Coder_L_Init(void)
{
        RCC->APB1ENR|=1<<2;                //TIM4 时钟使能,T4在APB1的2位
        RCC->APB2ENR|=1<<3;                //IOPBEN='1' 使能PORT B端口时钟
        RCC->APB2ENR|=1<<0;                //开启辅助时钟,AFIO复用时钟使能

        GPIOB->CRH&=0XFFFFFF00;                //PB8/PB9,作为L编码器的AB相输入端口
        GPIOB->CRH&=0XFFFFFF44;                //PB8/PB9,设置为浮空输入

        TIM4->PSC = 0x00;                //预分频器
        TIM4->ARR = ENCODER_TIM_PERIOD-1;//设定计数器自动重装值
        TIM4->CR1 &=~(3<<5);                //选择计数模式:边沿对齐模式

        TIM4->CCMR2 |= 1<<0;                //CC3S='01'通道配置为输入,IC1FP3映射在TI3
        TIM4->CCMR2 |= 1<<8;                //CC4S='01'通道配置为输入,IC2FP4映射在TI4
        TIM4->CCMR2 |= 3<<4;                //IC3F=0011,配置输入滤波器
        TIM4->CCER &= ~(1<<9);                //CC3P取反='0' IC3FP3不反相 IC3FP3=TI3
        TIM4->CCER &= ~(1<<13);                //CC4P取反='0' IC4FP4不反相 IC4FP4=TI4               
       
        TIM4->SMCR |= 3<<0;                //SMS='011'设置编码器模式3,计时器在TI1FP1和TI2FP2的边沿向上/向下计数(上升沿,和下降沿有效)                                       

        TIM4->CNT = COUNTER_RESET;        //设定计数器初始值为32767
        TIM4->CR1 |= 0x01;                //CEN='1'使能计数器
}

/******************************************/

//        定时器1中断服务

void TIM1_CC_IRQHandler(void)

{
        static u8 i=0;                         //声明静态变量并初始化
        if(TIM1->SR&0X0001)                //执行溢出中断
        {
                Angle_Calcu();
                //Balance_filter();        //平衡滤波器
                i++;       
                if(i==10)
                {
                        Test_Led=~Test_Led; //交替取反LED
                        i=0;
                }
        }
        TIM1->SR&=~(1<<0);                //清除中断标志位

}

/******************************************/


void TIM1_Int_Init(u16 arr,u16 psc)
{
        RCC->APB1ENR|=1<<11;                //TIM1EN='1' 开启定时器TM1使能
        TIM1->ARR=arr;                        //设定计数器自动重装值,刚好1ms
        TIM1->PSC=psc;                        //预分频器7200,得到10KHZ的计数时钟
        TIM1->DIER|=1<<0;                //UIE='1' 允许中断更新
        TIM1->CR1|=0x01;                //CEN='1'使能计数器
        MY_NVIC_Init(1,3,TIM1_CC_IRQn,2);//抢占1,子优先级3,组2
}
原子哥写的这个不工作呀!
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-24 22:05

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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