8 changed files with 186 additions and 37 deletions
-
4.settings/language.settings.xml
-
1.vscode/c_cpp_properties.json
-
88usrc/main.cpp
-
64usrc/serial485_to_analog.cpp
-
55usrc/serial485_to_analog.hpp
-
9usrc/temperature_sensor.cpp
-
2usrc/temperature_sensor.hpp
-
BIN模拟量输出系列使用手册(RS485版).pdf
@ -0,0 +1,64 @@ |
|||
#include "serial485_to_analog.hpp"
|
|||
#include "sdk\components\modbus\modbus_basic.hpp"
|
|||
using namespace iflytop; |
|||
using namespace std; |
|||
|
|||
void Serial485ToAnalog::initialize(UART_HandleTypeDef* uart, DMA_HandleTypeDef* hdma_tx, DMA_HandleTypeDef* hdma_rx) { |
|||
m_uart = uart; |
|||
m_hdma_tx = hdma_tx; |
|||
m_hdma_rx = hdma_rx; |
|||
} |
|||
|
|||
void Serial485ToAnalog::reg(TemperatureSensor* ts) { |
|||
ZASSERT(m_sensorNum < ZARRAY_SIZE(m_sensor)); |
|||
m_sensor[m_sensorNum] = ts; |
|||
m_sensorNum++; |
|||
} |
|||
|
|||
void Serial485ToAnalog::start() { |
|||
zthread.init("Serial485ToAnalog-thread"); |
|||
zthread.start([this]() { |
|||
while (!zthread.getExitFlag()) { |
|||
float temperture_i_val[5] = {0}; // 温度电流数值
|
|||
static_assert(ZARRAY_SIZE(temperture_i_val) == ZARRAY_SIZE(m_sensor)); |
|||
|
|||
for (int i = 0; i < m_sensorNum; i++) { |
|||
temperture_i_val[i] = m_sensor[i]->readCurrentVal(); |
|||
} |
|||
|
|||
// 参考 模拟量输出系列使用手册(RS485版).pdf
|
|||
// 3位小数点,电压输出:分辨率0.001V。
|
|||
// 0064H 通道1
|
|||
// 0065H 通道2
|
|||
// 0066H 通道3
|
|||
// 0067H 通道4
|
|||
// 0068H 通道5
|
|||
|
|||
uint16_t write_reg_val[5] = {0}; |
|||
for (int i = 0; i < m_sensorNum; i++) { |
|||
write_reg_val[i] = (uint16_t)(temperture_i_val[i] * 1000); |
|||
} |
|||
writeReg10Muti(0x01, 0x0064, write_reg_val, m_sensorNum, 1000); |
|||
zthread.sleep(10); |
|||
} |
|||
}); |
|||
} |
|||
|
|||
int32_t Serial485ToAnalog::writeReg10Muti(uint8_t slaveAddr, uint16_t regAddr, uint16_t* regVal, uint16_t nreg, int overtimems) { |
|||
m_txbuff[0] = slaveAddr; |
|||
m_txbuff[1] = 0x10; |
|||
m_txbuff[2] = regAddr >> 8; |
|||
m_txbuff[3] = regAddr & 0xff; |
|||
m_txbuff[4] = 0x00; |
|||
m_txbuff[5] = nreg; |
|||
m_txbuff[6] = nreg * 2; // 字节数
|
|||
for (int i = 0; i < nreg; i++) { |
|||
m_txbuff[7 + i * 2] = regVal[i] >> 8; |
|||
m_txbuff[8 + i * 2] = regVal[i] & 0xff; |
|||
} |
|||
|
|||
modbus_pack_crc_to_packet(m_txbuff, 7 + nreg * 2 + 2); |
|||
HAL_UART_Transmit(m_uart, m_txbuff, 7 + nreg * 2 + 2, 1000); |
|||
|
|||
return 0; |
|||
} |
@ -0,0 +1,55 @@ |
|||
//
|
|||
// Created by zwsd
|
|||
//
|
|||
|
|||
#pragma once
|
|||
#include "sdk/os/zos.hpp"
|
|||
//
|
|||
#include "sdk/chip/api/zi_temperature.hpp"
|
|||
#include "sdk\chip\api\zi_adc.hpp"
|
|||
#include "sdk\components\hardware\adc\z_simple_adc.hpp"
|
|||
#include "sdk\components\zprotocols\zcancmder_v2\api\api.hpp"
|
|||
#include "temperature_sensor.hpp"
|
|||
|
|||
namespace iflytop { |
|||
using namespace std; |
|||
|
|||
class Serial485ToAnalog { |
|||
private: |
|||
uint8_t m_txbuff[128]; |
|||
TemperatureSensor* m_sensor[5] = {NULL}; |
|||
int m_sensorNum = 0; |
|||
|
|||
UART_HandleTypeDef* m_uart; |
|||
DMA_HandleTypeDef* m_hdma_tx; |
|||
DMA_HandleTypeDef* m_hdma_rx; |
|||
int m_baudrate; |
|||
|
|||
ZThread zthread; |
|||
|
|||
// int32_t ZADC::get_adc_value(int32_t& adcval) {
|
|||
// ADC_ChannelConfTypeDef sConfig = {0};
|
|||
// sConfig.Channel = m_channel; /* ͨµÀ */
|
|||
// sConfig.Rank = 1;
|
|||
// sConfig.SamplingTime = m_samplingTime; /* ²ÉÑùʱ¼ä */
|
|||
// if (HAL_ADC_ConfigChannel(m_hadc1, &sConfig) != HAL_OK) {
|
|||
// return err::kmicro_adcRecvFail;
|
|||
// }
|
|||
// HAL_ADC_Start(m_hadc1);
|
|||
// HAL_ADC_PollForConversion(m_hadc1, HAL_MAX_DELAY);
|
|||
// adcval = (uint16_t)HAL_ADC_GetValue(m_hadc1);
|
|||
// return 0;
|
|||
// }
|
|||
|
|||
public: |
|||
void initialize(UART_HandleTypeDef* uart, DMA_HandleTypeDef* hdma_tx, DMA_HandleTypeDef* hdma_rx); |
|||
void reg(TemperatureSensor* ts); |
|||
|
|||
void start(); |
|||
|
|||
private: |
|||
int32_t writeReg10Muti(uint8_t slaveAddr, uint16_t regAddr, uint16_t* regVal, uint16_t nreg, int overtimems); |
|||
void txAndRx(uint8_t* tx, uint8_t txdatalen, uint8_t* rx, uint8_t expectrxsize, uint16_t overtimems); |
|||
}; |
|||
|
|||
} // namespace iflytop
|
Write
Preview
Loading…
Cancel
Save
Reference in new issue