add dac_adc test
This commit is contained in:
parent
618bf3266a
commit
4370ee3d69
|
@ -4,4 +4,4 @@ find_package(Zephyr)
|
||||||
project(cryosnom1)
|
project(cryosnom1)
|
||||||
include_directories("../firmware")
|
include_directories("../firmware")
|
||||||
|
|
||||||
target_sources(app PRIVATE src/main.c)
|
target_sources(app PRIVATE src/io.c src/dac_adc_test_main.c)
|
||||||
|
|
|
@ -0,0 +1,211 @@
|
||||||
|
#include <zephyr/zephyr.h>
|
||||||
|
#include <zephyr/kernel.h>
|
||||||
|
#include <zephyr/logging/log.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include "pin_io.h"
|
||||||
|
#include "io.h"
|
||||||
|
|
||||||
|
LOG_MODULE_REGISTER(dac_adc_test_main);
|
||||||
|
|
||||||
|
#define ATTEMPTS 5
|
||||||
|
|
||||||
|
static bool dac_ready[DAC_MAX] = {0};
|
||||||
|
|
||||||
|
static void
|
||||||
|
init_dacs(void)
|
||||||
|
{
|
||||||
|
for (size_t i = 0; i < DAC_MAX; i++) {
|
||||||
|
for (int j = 0; j < ATTEMPTS; j++) {
|
||||||
|
if (dac_init(i)) {
|
||||||
|
LOG_INF("DAC #%zu initialized, attempt %d\n", i, j);
|
||||||
|
dac_ready[i] = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!dac_ready[i])
|
||||||
|
LOG_WRN("DAC #%zu disconnected!\n", i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
K_MUTEX_DEFINE(print_mutex);
|
||||||
|
|
||||||
|
static void
|
||||||
|
print_mutex_unlock_impl(const char *func)
|
||||||
|
{
|
||||||
|
if (k_mutex_unlock(&print_mutex) != 0) {
|
||||||
|
LOG_ERR("Fatal error in mutex_unlock in %s\n", func);
|
||||||
|
k_fatal_halt(K_ERR_KERNEL_PANIC);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#define print_mutex_unlock() print_mutex_unlock_impl(__func__)
|
||||||
|
|
||||||
|
struct dac_info {
|
||||||
|
float lo;
|
||||||
|
float hi;
|
||||||
|
unsigned num;
|
||||||
|
};
|
||||||
|
|
||||||
|
#ifdef PRINT_DAC
|
||||||
|
#define MAX_DAC (1 << 20) - 1
|
||||||
|
|
||||||
|
static void
|
||||||
|
print_dac(const struct dac_info *info, uint32_t val)
|
||||||
|
{
|
||||||
|
k_mutex_lock(&print_mutex, K_FOREVER);
|
||||||
|
|
||||||
|
float volt = (info->hi - info->lo) * val / MAX_DAC
|
||||||
|
+ info->lo;
|
||||||
|
LOG_PRINTK("DAC\t%u\t%f\n", info->num, volt);
|
||||||
|
|
||||||
|
print_mutex_unlock();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static void
|
||||||
|
dac_thread(void *p1, void *p2, void *p3)
|
||||||
|
{
|
||||||
|
ARG_UNUSED(p2);
|
||||||
|
ARG_UNUSED(p3);
|
||||||
|
|
||||||
|
const struct dac_info *info = p1;
|
||||||
|
uint32_t val = (1 << 19);
|
||||||
|
int incr = 1;
|
||||||
|
#ifdef PRINT_DAC
|
||||||
|
int print_cntr = 0;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
for (;;) {
|
||||||
|
dac_write_v(info->num, val);
|
||||||
|
if (val == 0xFFFFF) {
|
||||||
|
incr = -1;
|
||||||
|
} else if (val == 0) {
|
||||||
|
incr = 1;
|
||||||
|
}
|
||||||
|
val += incr;
|
||||||
|
#ifdef PRINT_DAC
|
||||||
|
if (print_cntr == 8000) {
|
||||||
|
print_cntr = 0;
|
||||||
|
print_dac(info);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
k_sleep(K_NSEC(125));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct adc_info {
|
||||||
|
float hi;
|
||||||
|
unsigned num;
|
||||||
|
unsigned wid;
|
||||||
|
};
|
||||||
|
|
||||||
|
static void
|
||||||
|
print_adc(const struct adc_info *info, int32_t val)
|
||||||
|
{
|
||||||
|
k_mutex_lock(&print_mutex, K_FOREVER);
|
||||||
|
|
||||||
|
const uint32_t bitnum = (1 << info->wid) - 1;
|
||||||
|
float volt = info->hi / bitnum * val;
|
||||||
|
LOG_PRINTK("ADC\t%u\t%f\n", info->num, volt);
|
||||||
|
|
||||||
|
print_mutex_unlock();
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
adc_thread(void *p1, void *p2, void *p3)
|
||||||
|
{
|
||||||
|
ARG_UNUSED(p2);
|
||||||
|
ARG_UNUSED(p3);
|
||||||
|
const struct adc_info *info = p1;
|
||||||
|
int32_t v;
|
||||||
|
|
||||||
|
for (;;) {
|
||||||
|
v = adc_read(info->num, info->wid);
|
||||||
|
print_adc(info, v);
|
||||||
|
k_sleep(K_MSEC(1000));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#define MK_DAC_INFO(n, lo, hi) [n] = {lo, hi, n}
|
||||||
|
const struct dac_info dac_info[DAC_MAX] = {
|
||||||
|
MK_DAC_INFO(0, -10, 10),
|
||||||
|
MK_DAC_INFO(1, -10, 10),
|
||||||
|
MK_DAC_INFO(2, -10, 10),
|
||||||
|
MK_DAC_INFO(3, -10, 10),
|
||||||
|
MK_DAC_INFO(4, -10, 10),
|
||||||
|
MK_DAC_INFO(5, -10, 10),
|
||||||
|
MK_DAC_INFO(6, -10, 10),
|
||||||
|
MK_DAC_INFO(7, -10, 10)
|
||||||
|
};
|
||||||
|
|
||||||
|
#undef MK_DAC_INFO
|
||||||
|
|
||||||
|
#define STACKSIZ 2048
|
||||||
|
#define MKSTACK(name, num) \
|
||||||
|
K_THREAD_STACK_DEFINE(name##_stk_##num, STACKSIZ)
|
||||||
|
|
||||||
|
#define DAC_STACK(n) MKSTACK(dac, n)
|
||||||
|
DAC_STACK(0);
|
||||||
|
DAC_STACK(1);
|
||||||
|
DAC_STACK(2);
|
||||||
|
DAC_STACK(3);
|
||||||
|
DAC_STACK(4);
|
||||||
|
DAC_STACK(5);
|
||||||
|
DAC_STACK(6);
|
||||||
|
DAC_STACK(7);
|
||||||
|
#undef DAC_STACK
|
||||||
|
|
||||||
|
const struct adc_info adc_info[ADC_MAX] = {
|
||||||
|
// TODO
|
||||||
|
};
|
||||||
|
|
||||||
|
#define ADC_STACK(n) MKSTACK(adc, n)
|
||||||
|
ADC_STACK(0);
|
||||||
|
ADC_STACK(1);
|
||||||
|
ADC_STACK(2);
|
||||||
|
ADC_STACK(3);
|
||||||
|
ADC_STACK(4);
|
||||||
|
ADC_STACK(5);
|
||||||
|
ADC_STACK(6);
|
||||||
|
ADC_STACK(7);
|
||||||
|
#undef ADC_STACK
|
||||||
|
|
||||||
|
#undef MKSTACK
|
||||||
|
|
||||||
|
void
|
||||||
|
main(void)
|
||||||
|
{
|
||||||
|
struct k_thread dac_tids[8];
|
||||||
|
struct k_thread adc_tids[8];
|
||||||
|
|
||||||
|
LOG_PRINTK("DAC ADC test program.\n");
|
||||||
|
init_dacs();
|
||||||
|
|
||||||
|
#define CREATE_THREAD(name, num) \
|
||||||
|
k_thread_create(&name##_tids[num], \
|
||||||
|
(k_thread_stack_t *) name##_stk_##num, \
|
||||||
|
K_THREAD_STACK_SIZEOF(&name##_stk_##num), \
|
||||||
|
name##_thread, &name##_info[num], NULL, NULL, \
|
||||||
|
-1, 0, K_MSEC(10))
|
||||||
|
|
||||||
|
CREATE_THREAD(dac, 0);
|
||||||
|
CREATE_THREAD(dac, 1);
|
||||||
|
CREATE_THREAD(dac, 2);
|
||||||
|
CREATE_THREAD(dac, 3);
|
||||||
|
CREATE_THREAD(dac, 4);
|
||||||
|
CREATE_THREAD(dac, 5);
|
||||||
|
CREATE_THREAD(dac, 6);
|
||||||
|
CREATE_THREAD(dac, 7);
|
||||||
|
|
||||||
|
CREATE_THREAD(adc, 0);
|
||||||
|
CREATE_THREAD(adc, 1);
|
||||||
|
CREATE_THREAD(adc, 2);
|
||||||
|
CREATE_THREAD(adc, 3);
|
||||||
|
CREATE_THREAD(adc, 4);
|
||||||
|
CREATE_THREAD(adc, 5);
|
||||||
|
CREATE_THREAD(adc, 6);
|
||||||
|
CREATE_THREAD(adc, 7);
|
||||||
|
|
||||||
|
#undef CREATE_THREAD
|
||||||
|
}
|
Loading…
Reference in New Issue