工具/软件:Code Composer Studio
大家好、我正在尝试使用通用超声波传感器 HC-SR04来检测物体、方法是测量其与传感器的距离;如果物体与该传感器之间的距离小于20cm、我应该用蜂鸣器发出警告、表明物体比实际距离更近。 距离传感器越近(如我之前所述、当距离小于20cm 时开始计数)、蜂鸣器的音调就会按比例增加(使用 PWM)。 因此、我的问题是(来自任何优化建议甚至是错误的一部分)、我想使用计时器 TA0.0 ISR 处理回波信号、我不知道如何考虑上升沿和下降沿。 是否有任何寄存器可在该边沿发生时进行调节? 我的代码中的 HC-SR04数据表中是否有我没有记住的内容? 请告诉我、会发生这种情况。
此外、我想知道是否有人对将其应用于主项目和更困难项目的应用有任何好的想法。 我将面临一个挑战。
事先谢谢。
我的代码是:
#include
#include
uint16_t volatile contador_microsegundos;//微秒计数器
uint32_t volatile start_time = 0;//回波脉冲的开始时间
uint32_t volatile end_time = 0;//回波脉冲结束时间
uint16_t volatile distancia_cm = 0;//测量的距离
void Inicializacion_Relojes (void)//使用 SMCLK --> 16MHz
{
_bis_SR_register (SCG0);//禁用 FLL 控制循环
UCSCTL0 = 0x0000;// Ponemos el DCOx y MODx al 最小可接受
UCSCTL1 = DCORSEL_5;//选择范围取消 operación DEL DCO 范围去16MHz
UCSCTL2 = FLLD_0 | 487;// Poniendo FLLD_0 hacemos tomamos como 1 el dividesde la frecuencia de entrada del crustal de cuarzo y 487 es el valor multiplicador de FLLN
//(N + 1)*(FLLRef/n)= Fdcomsp430
//(487 + 1)*(32768/1)= 16MHz
UCSCTL3 = 0;// FLL SELREF = XT1CLK y 除数 de FLL = 1 (FLLREFDIV = FLLREFCLK/1)
UCSCTL4 |= SELA_0 | SELM_4 | SELM_4;// tomamos ACLK = XT1CLK (Cuarzo extern DE 2^15位);SMCLK = MCLK = DCOCLKDIV (DCO interno de 16MHz)
UCSCTL5 |= DIV_0 | DIVS_0;//除数参数 SMCLK = f (SMCLK)/1;ACLK = f (ACLK)/1
_BIC_SR_register (SCG0);//启用 FLL 控制环路
}
void init_pines_ultrasonidos (void)
{
P1DIR &=~BIT1;//引脚回波作为输入
P1SEL |= BIT1;//模式捕捉输入信号(CCI0A)
P2DIR |= BIT1;//引脚触发作为输出
P2SEL &=~BIT1;// GPIO 引脚
P2OUT &=~BIT1;//引脚触发低电平
}
void pin_bon蜂 鸣器(void)//引脚 P3.6作为 TB0.6 -> P3DIR.6 = 1;P3SEL.6 = 1 (请参阅表6-48数据表 MSP430F5529)
{
P3SEL |= BIT6;// P3.6作为替代函数(PARA 定时器 TB0.6 según 数据表 MSP430F5529)
P3DIR |= BIT6;//引脚作为蜂鸣器输出
}
void delay_microsegundos (uint16_t microsegunds_totales)//微秒延迟函数--> SMCLK
{
contador_microsegundos = 0;
TA2CTL |= MC_1;//向上计数模式
TA2CCTL0 |= CCIE;
while (contader_microsegundos < microsegunds_totales);
TA2CTL &=~MC_3;//停止计时器
}
void TimerA0_CAPTURE (void)//用于捕获超声波传感器回波信号的计时器--> TA0.0 en modo 捕捉输入(CCI0A)
{
TA0CCTL0 |= CM_3 | SCS | CCIS_0 | CAP | CCIE;// CM_3:捕获信号的上升沿和下降沿;CCIS_0:CCIxA -> TimerA 中的捕获/比较;CAP:启用捕获模式;CCIE:启用中断
TA0CTL |= tassel_2 | MC_2 | ID_0 | TACLR;// tassel_2:SMCLK;MC_2:连续模式;ID_0:F (SMCLK)/1;TACLR:复位计时器
}
使 TimerA2 (void)//计时器保持微秒
{
TA2CCR0 = 15;// f (SMCLK)/1 = 16MHz ->(16·10^6个脉冲/段)·(1seg / 10^6us)= 16 - 1 = 15。
TA2CTL |= tassel_2 | ID_0 | MC_0;// tassel_2:SMCLK;ID_0:除数频率->f (SMCLK)/1;MC_0:停止模式
}
void TimerB0_PWM (void)//用于监控蜂鸣器 PWM 的计时器
{
TB0CCR0 = 249;// período DE PWM:250脉动--> 4kHz (o 0、25ms)--> 1000脉冲/ms·0、25ms (4kHz 的倒数)= 250 -1 = 249。
TB0CCTL6 |= OUTMOD_7;// Modo CCR6:PWM 复位/设置-->增大 CCR6值也会增加占空比-->蜂鸣器幅值增大
TB0CCR6 = 0;//占空比官方值:0 %。 TB0.6 -> TB0CCR6。
TB0CTL |= tassel_2 | ID_0 | MC_1 | TACLR;// tassel_2:SMCLK;ID_2:除数频率->f (SMCLK)/1;MC_1:向上计数模式
}
void main()
{
WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器
Inicializacion_Relojes();
init_pines_ultrasonidos();
PIN_蜂 鸣器();
TimerA0_capture ();
TimerA2();
TimerB0_PWM ();
_enable_interrupt ();
while (1){
P2OUT |= BIT1;//生成脉冲触发器
DELAY_microsegundos (10);// 触发引脚中的10us 脉冲、用于获取测量值(请参阅数据表 HC-SR04)
P2OUT &=~BIT1;//禁用触发脉冲
if (distancia_cm < 20 && distance!= 0){//如果物体与传感器之间的距离小于20cm 并且也不同于零。
TB0CCR6 = 0;//复位决定最终 PWM 值的定时器值
TB0CCR6 += 249 -(distancia_cm * 12);// Aumentamos la frecencia del Tono del 蜂鸣器符合 estamos más certa del objetto (一个 menor distancia)
Delay_microsegundos (60000);// 60ms 测量周期、以防止触发信号进入回波信号(请参阅数据表 HC-SR04)
}
}
#pragma vector=TIMER2_A0_vector
_interrupt void timer2_A0_ISR (void)//计时器
{
contador_microsegundos++;
TA2CCTL0 &=~CCIFG;
}
#pragma vector=TIMER0_A0_VECTOR // ISR DE 捕捉信号 TA0.0
_interrupt void Timer0_A0 (void)
{
//如果上升沿条件: -->这就是问题所在
START_TIME = TA0CCR0;//在我们中进行第一次测量
//否则-->也在这里
end_time = TA0CCR0;//在我们中进行第二次时间测量
distancia_cm =(end_time - start_time)/58;//要获得以厘米为单位的距离:(以 us/58为单位的时间)
}