完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
输入捕获中波形的脉冲宽度值与传感器输出的原始脉冲不匹配。
请帮忙。 #include #include #include <标准参数.h> void Ultra_setting(); 无效延迟(int val); void Tim3_Capture(); void Uart1_config(); void uart_printf(const char *fmt, ...); uint32_t timeStamp1 = 0,timeStamp2=0,width=0,Distance=0; 无符号整数标志=0; void TIM3_IRQHandler() { uint32_t 时间 = TIM3->CCR1; 如果(标志==0) { 时间戳1=时间; } 别的 { timeStamp2=时间; 如果(时间戳2>时间戳1) { 宽度=时间戳2-时间戳1; } 否则如果(时间戳2<时间戳1) { 宽度= (0xffff - timeStamp1) + timeStamp2; } 距离 = 宽度 *(.034/2); 标志=0; WRITE(NVIC_ISER0 ,(0<<29));/*禁用 TIM3 中断 */ TIM3->CR1=0;/*禁用计数器*/ uart_printf("距离是 %d %d %d %d ", Distance,timeStamp1,timeStamp2,width); } 标志++; } 主函数() { //GPIO A配置 系统初始化(); 超设置(); Uart1_config(); Tim3_Capture();/*启用Tim3捕获*/ GPIOA->ODR |=1<<12;/* 开启 PA12pin */ 延迟(100);/* 10 微秒开启*/ GPIOA->ODR &=~(1<<12);/* 打开 PA12 引脚 */ 同时(1); } 字符缓冲区[512]; void uart_printf(const char *fmt, ...) { 诠释; va_list 参数; va_start(args,fmt); ret = vsnprintf(buf, 512, fmt, args); va_end(参数); 如果(返回 > 0) { for (int i =0; i < ret; i++) { USART1->SR = 0; USART1->DR = buf; while(!(USART1->SR & (1<<6)) ); } } } void Uart1_config() { RCC->APB2ENR |=USART1_CLK; RCC->AHB1ENR |=1; GPIOA->MODER |=2<<18;/* PA9 使能模式 */ GPIOA->MODER |=2<<20;/*PA9使能模式*/ GPIOA->OSPEEDR |=3<<18;/* 开启PA9高速*/ GPIOA->OSPEEDR |=3<<20;/* 启用PA10的高速*/ GPIOA->AFR[1] |=7<<4;/*使能PA9的AFR7 */ GPIOA->AFR[1] |=7<<8;/*启用PA10的AFR8 */ USART1->CR1 |=USART1_EN; USART1->BRR =((3<<0) | (0x68<<4)); /*9600波特率*/ USART1->CR1 |=USART1_RE; USART1->CR1 |=USART1_TE; } void Tim3_Capture() { //输入捕获模式 RCC->APB1ENR |= 2; //启用定时器 3 TIM3->PSC = 16;/*除以 16 - 1 Mhz*/ TIM3->CCMR1 |=TIM2_CCIS;//01:CC1通道配置为输入,IC1映射到TI1上。 TIM3->CCER |=1; //使能CH1输入捕获 TIM3->CCER |=5<<1; //使能 11:非反相/双边 WRITE(NVIC_ISER0 ,(1<<29));//启用定时器中断。 TIM3->DIER =1<<1; //Bit 1 CC1IE: 捕获/比较 1 中断使能 TIM3->CR1 = 1;//启用TIM3 TIM3->CNT=0; } 无效 Ultra_setting() { RCC->AHB1ENR |=1; /* 为 GPIOA 端口启用时钟 */ GPIOA->MODER |=2<<12;/*PA6 pORT中的替代功能*/ GPIOA->MODER |=1<<24;/*PA12口通用输出功能*/ GPIOA->AFR[0]|=2<<24;/* 备用功能低位寄存器是 AF1 是 TIM3_CH1 */ GPIOA->OSPEEDR|=1<<12;/*中速*/ } 无效延迟(int val) { RCC->APB1ENR |=1<<0; /* 启用 TIM2 时钟 */ TIM2->CNT=0; TIM2->PSC=1; TIM2->CR1 |=1; 同时(TIM2->CNT < val); TIM2->SR=0; } |
|
相关推荐
1个回答
|
|
|
|
|
|
只有小组成员才能发言,加入小组>>
请教:在使用UDE STK时,单片机使用SPC560D30L1,在配置文件怎么设置或选择?里面只有SPC560D40的选项
2724 浏览 1 评论
3237 浏览 1 评论
请问是否有通过UART连接的两个微处理器之间实现双向值交换的方法?
1807 浏览 1 评论
3646 浏览 6 评论
6034 浏览 21 评论
1336浏览 4评论
197浏览 3评论
对H747I-DISCO写程序时将CN2的st-link复用为usart1,再次烧录时无法检测到stlink怎么解决?
350浏览 2评论
STM32G474RE芯片只是串口发个数据就发烫严重是怎么回事?
442浏览 2评论
STM32处理增量式编码器Z信号如何判断中断是正转的还是反向转的?
268浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 11:35 , Processed in 1.074335 second(s), Total 80, Slave 63 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号