我想用PWM(TIM2输出)信号模拟光电编码器输出;用TIM4捕获PWM信号频率。通过频率到位移量化,用TIM3定时一定时间,输出这段时间内的位移总量。我觉得可以,就是实现不了????
下面是我的程序,请高手指教,谢谢!
主函数如下:
#include <stm32f10x_lib.h>
#include "sys.h"
#include "usart.h"
#include "delay.h"
#include "timer.h"
#include "buhuo.h"
#include "stdio.h"
u16 Frequency;
u16 IC1Value;
extern u16 weiyi;
int main(void)
{
Stm32_Clock_Init(9); //系统时钟设置
delay_init(72); //延时初始化
uart_init(72,9600); //串口初始化
Capture_Init(600,7199);
  WM_Init(100,7199);
Timerx_Init(5000,7199);
while(1)
{
LED2_PWM_VAL=50;
LED3_PWM_VAL=60;
printf("weiyi=%d\r\n",weiyi);
delay_ms(10);
}
}
捕获函数如下:buhou.c
#include <stm32f10x_lib.h>
#include "sys.h"
#include "usart.h"
#include "delay.h"
#include "buhuo.h"
extern u16 IC1Value;
extern u16 Frequency;
void Capture_Init(u16 arr,u16 psc)
{
RCC->APB2ENR|=1<<0;
RCC->APB1ENR|=1<<2;
RCC->APB2ENR|=1<<3;
TIM4->ARR=arr; //设定计数器自动重装值//刚好1ms
TIM4-> SC=psc; //预分频器,
GPIOB->CRL&=0XF0FFFFFF;//PB6 输出
GPIOB->CRL|=0X08000000;//复用功能输出
GPIOB->ODR|=1<<6;//PB6 上拉
TIM4->SMCR|=0x00D4;
TIM4->CCMR1|=1<<0;//CC1S=01 选择输入端 IC1映射到TI1上
TIM4->CCMR1|=3<<4; //IC1F=0011配置输入滤波器,采样频率=fdts/2,N=8
TIM4->CCER&=~(1<<1); //CC1P=0 选择有效转换边沿 上升沿有效
TIM4->CCMR1&=~(1<<2); //IC1PS=00 配置输入分频
TIM4->CCER|=1<<0; //CC1E=1 允许捕获计数器的值到捕获寄存器中
TIM4->CCMR1|=2<<8;//CC2S=10 选择输入端 IC2映射到TI2上
TIM4->CCER|=1<<5; //CC2P=1 选择有交转换边沿 下降沿有效
TIM4->CCER|=1<<4; //CC2E=1 允许捕获计数器的值到捕获寄存器中
TIM4->DIER|=1<<1; //允许更新捕获中断
TIM4->CR1|=0x01; //使能定时器4
MY_NVIC_Init(1,1,TIM4_IRQChannel,2);//抢占1,子优先级3,组2
}
void TIM4_IRQHandler(void)
{
IC1Value = TIM4->CCR1;//读取CCR1也可以清CC1IF标志位
Frequency =1000000.0f/IC1Value ;
TIM4->SR&=~(1<<1);//清除中断标志位
}
timer.c 函数如下:
#include "timer.h"
#include "buhuo.h"
#include "stdio.h"
extern u16 Frequency;
u16 weiyi=0;
#define P 3.14159269
#define R 0.05
void TIM3_IRQHandler(void)
{
static u8 i=0;
if(TIM3->SR&0X0001)
{
i++;
if(i==5)
{
i=0;
if (Frequency<200)
weiyi+=2*P*R* Frequency /200;
}
}
TIM3->SR&=~(1<<0);//清除中断标志位
}
void Timerx_Init(u16 arr,u16 psc)
{
RCC->APB1ENR|=1<<1;//TIM3时钟使能
TIM3->ARR=arr; //设定计数器自动重装值//刚好1ms
TIM3-> SC=psc; //预分频器7200,得到10Khz的计数时钟
//这两个东东要同时设置才可以使用中断
TIM3->DIER|=1<<0; //允许更新中断
TIM3->CR1|=0x01; //使能定时器3
MY_NVIC_Init(3,3,TIM3_IRQChannel,3);//抢占1,子优先级3,组2
}
void PWM_Init(u16 arr,u16 psc)
{
//此部分需手动修改IO口设置
RCC->APB1ENR|=1<<0; //TIM3时钟使能
GPIOA->CRL&=0XFFFF00FF;//PA7输出
GPIOA->CRL|=0X0000BB00;//复用功能输出
GPIOA->ODR|=1<<2;//PA7上拉
GPIOA->ODR|=1<<3;//PA7上拉
TIM2->ARR=arr;//设定计数器自动重装值
TIM2-> SC=psc;//预分频器不分频
TIM2->CCMR2|=7<<12; //CH2预装载使能
TIM2->CCMR2|=1<<11; //CH2预装载使能
TIM2->CCMR2|=7<<4; //CH2预装载使能
TIM2->CCMR2|=1<<3; //CH2预装载使能
TIM2->CCER|=1<<8; //OC2 输出使能
TIM2->CCER|=1<<12; //OC2 输出使能
TIM2->CR1=0x8000; //ARPE使能
TIM2->CR1|=0x01; //使能定时器3
}
|