使用Ardunio STM32F103C8T6发送 433/315Hz ASK信号

ARDUINO找不到合适的库

在ARDUINO中最比较好的库rc-switch(https://github.com/sui77/rc-switch),但是他对STM32不太兼容,需要修改,但修改后发现通信无法与我之前的解码不兼容,无奈之下只好再这个库里抽取代码以便适应原有的解码。

#define nTransmitterPin   PA5

struct HighLow {
        uint8_t high;
        uint8_t low;
    };
struct Protocol {
        int pulseLength;
        HighLow syncFactor;
        HighLow one;
        HighLow zero;
        /** @brief if true inverts the high and low logic levels in the HighLow structs */
        bool invertedSignal;
    };

        
static const Protocol PROGMEM proto[] = {
  {115, {85, 10}, {10,  3}, {3,  10}, false },
  {50, {100, 12}, {12,  4}, {4,  12}, false }   // protocol 1
      // protocol 2
};

Protocol protocol;
int nRepeatTransmit;
unsigned char code[8];

void transmit(HighLow pulses) {
  uint8_t firstLogicLevel = (protocol.invertedSignal) ? LOW : HIGH;
  uint8_t secondLogicLevel = !firstLogicLevel;//(protocol.invertedSignal) ? HIGH : LOW;
  digitalWrite(nTransmitterPin, firstLogicLevel);
  delayMicroseconds(protocol.pulseLength * pulses.high);
  digitalWrite(nTransmitterPin, secondLogicLevel);
  delayMicroseconds(protocol.pulseLength * pulses.low);
}

void send() {
  protocol=proto[0];
  digitalWrite(nTransmitterPin, LOW);
  delayMicroseconds(500);
  for (int nRepeat = 0; nRepeat < 8; nRepeat++) {
    transmit(protocol.syncFactor);
    for(int Cmds=0;Cmds<8;Cmds++){       
      for (int i = 7; i >= 0; i--) {        
        if (code[Cmds] & (1 << i)){
          transmit(protocol.one);          
        }else{
          transmit(protocol.zero);          
        }
      }     
    }
    digitalWrite(nTransmitterPin, HIGH);
    delayMicroseconds(100);
  }
}

void SendData(char Cmd1,char Cmd2,char Value1,char Value2){  
  Serial.print("Send Data[");
  code[0]=0x55; //0,1:CHIP_ID;
  code[1]=0xAA;
  code[2]=Cmd1; //2:CMD;
  code[3]=Cmd2; //3,4,5,6:DATA;
  code[4]=Value1;
  code[5]=Value2;
  code[6]=0x80; 
  unsigned char Crc = 0;
  for (int k = 0; k <= 6; k++) {
    Serial.print(code[k]);Serial.print(",");
    Crc += code[k];
  }  
  code[7]=Crc; //7:CRC
  Serial.print(code[7]);
  Serial.println("]");
  code[8]=0x3A; //8:未用
  send();
}
void setup() {
  Serial.begin(115200);
  pinMode(nTransmitterPin, OUTPUT);           
  pinMode(PC13, OUTPUT);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }
  delay(500);
  Serial.println("Start...");
}
char Value_H=0;
char Value_L=0;

void loop() {
  
  SendData('0','1',Value_H,Value_L);
  Value_L++;
  if(Value_L>=255){
    Value_H++;
    Value_L=0;
    if(Value_H>=255) Value_H=Value_L=0;
  }
}

用示波器看看ARDUNIO的delay()和delayMicroseconds()的时间是否是正确的

我再时间调试中发现这两个函数的时间与实际时间不同,因此在程序中的时间不是正常的
例如我想同步时先发送5000微妙的高电平再发送600微妙的低电平,那么应该写

digitalWrite(nTransmitterPin, firstLogicLevel);
delayMicroseconds(5000);
digitalWrite(nTransmitterPin, secondLogicLevel);
delayMicroseconds(600);

但实际需要写为

digitalWrite(nTransmitterPin, firstLogicLevel);
delayMicroseconds(9770);
digitalWrite(nTransmitterPin, secondLogicLevel);
delayMicroseconds(1150);

因此这些在实际调试中的问题都需要我们仔细的去发现问题和解决问题。
虽然ARDUNIO给我我们方便的开发环境,但是某些坑还得自己慢慢爬。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于STM32的ASK调制与解调器设计可以分为发送端和接收端两部分。 在发送端,首先需要使用STM32开发板作为主控,通过编程控制GPIO口来实现ASK调制信号的产生。可以使用STM32的定时器功能来生成特定频率的方波信号,然后根据需要的ASK调制频率和波特率设置定时器的相关参数,以产生相应的ASK调制信号。 在接收端,也需要使用STM32开发板作为主控,通过编程控制GPIO口来实现ASK信号的解调。可以采用外部的ASK解调器模块连接到STM32的IO口上,然后使用GPIO输入模式接收ASK信号。通过定时器的中断功能来处理接收到的ASK信号,通过分析接收到的ASK信号的高低电平变化来还原数据信息。 为了实现可靠的ASK调制与解调功能,还需要在硬件电路设计方面做一些优化。比如,可以在发送端增加滤波电路,以去除ASK信号中的杂散噪声;在接收端增加放大电路,以增强ASK信号的灵敏度。 此外,在软件部分,我们还需要编写相应的配置和控制程序来实现ASK调制与解调的功能。在发送端,需要编写定时器相关的配置程序,并根据数据信息控制GPIO口输出ASK调制信号;在接收端,需要编写中断处理函数来解析接收到的ASK信号,并还原数据信息。 总的来说,基于STM32的ASK调制与解调器设计需要在硬件和软件两方面进行综合考虑和设计,通过合理配置和控制相应的模块和功能,最终可以实现稳定可靠的ASK调制与解调功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值