初级会员

- 积分
- 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
}
原子哥写的这个不工作呀! |
|