Forum: Mikrocontroller und Digitale Elektronik Atmel SAM D10


von Dominik G. (grosdode)


Lesenswert?

Hallo zusammen,

nachdem Atmel nun auch günstige Boards mit ARM Controllern anbietet habe 
ich mir das SAM D10 Xplained Mini besorgt und gleich mal angefangen. 
Viele Dinge liefen schnell doch andere machen mir Probleme. Zum einen 
würde ich gern die WEX Einheit zum laufen bekommen, bisher habe ich das:
1
static void configure_tcc(void)
2
{
3
  struct tcc_config config_tcc;
4
  tcc_get_config_defaults(&config_tcc, CONF_PWM_MODULE);
5
  config_tcc.counter.period = PERIODE;
6
  config_tcc.compare.wave_generation = TCC_WAVE_GENERATION_SINGLE_SLOPE_PWM;
7
  config_tcc.compare.match[CONF_PWM_CHANNEL] = (PERIODE / 4);
8
  config_tcc.pins.enable_wave_out_pin[CONF_PWM_OUTPUT] = true;
9
  config_tcc.pins.wave_out_pin[CONF_PWM_OUTPUT] = CONF_PWM_OUT_PIN;
10
  config_tcc.pins.wave_out_pin_mux[CONF_PWM_OUTPUT] = CONF_PWM_OUT_MUX;
11
  
12
  config_tcc.compare.match[2] = (PERIODE / 4);
13
  config_tcc.pins.enable_wave_out_pin[2] = true;
14
  config_tcc.pins.wave_out_pin[2] = PIN_PA06F_TCC0_WO2;
15
  config_tcc.pins.wave_out_pin_mux[2] = PINMUX_PA06F_TCC0_WO2;
16
  /* Invert the Waveform output[1] channel to view the DTI effect */
17
  config_tcc.wave_ext.invert[2] = true;
18
  
19
  /* Enable the Dead Time Insertion Generator for the channel 2 (CC2) */
20
  TCC0->WEXCTRL.reg |= TCC_WEXCTRL_DTIEN1 | TCC_WEXCTRL_DTIEN2;
21
  
22
  /* Define the High s->e time and Low side time for Dead Time generation */
23
  TCC0->WEXCTRL.reg |= TCC_WEXCTRL_DTLS(0xFF) | TCC_WEXCTRL_DTHS(0xFF);
24
  
25
  tcc_init(&tcc_instance, TCC0, &config_tcc);
26
  tcc_enable(&tcc_instance);
27
}

aber leider tut sich da nichts mit dead Time.

Zum anderen scheitere ich an der CPU Clock die ich einfach nicht auf 
etwas anderes als 8MHz eingestellt bekomme (schneller wäre schön, 
langsamer hab ich nicht versucht sollte aber mit dem internen 32kHz oder 
einem größeren Teiler möglich sein). Ich würde nur ungern nen externen 
Quarz an das Board basteln

Hat sich schon jemand an der SAM D Reihe beschäftigt oder kennt eine 
nette Seite? Ich kann mich leider nur schwer mit der Dokumentation des 
AFS anfreunden.

von Dominik G. (grosdode)


Lesenswert?

Falls jemand Interesse an der Antwort hat:
Die Clock kann man ändern indem man die entsprechende ASF "SYSTEM-Clock 
Management for SAMD10" dazu nimmt und dann unter config/conf_clocks.h 
von flase zu true ändert.
1
#  define CONF_CLOCK_DFLL_ENABLE                  true
2
#  define CONF_CLOCK_OSC32K_ENABLE                true
3
#  define CONF_CLOCK_GCLK_1_ENABLE                true
Außerdem muss noch die Funktion aufgerufen werden:
1
void configure_clock(void)
2
{
3
  struct system_clock_source_dfll_config config_dfll;
4
  system_clock_source_dfll_get_config_defaults(&config_dfll);
5
  system_clock_source_dfll_set_config(&config_dfll);
6
  
7
  /* Enable the DFLL oscillator */
8
  enum status_code dfll_status = system_clock_source_enable(SYSTEM_CLOCK_SOURCE_DFLL);
9
  
10
  if (dfll_status != STATUS_OK)
11
  {
12
    configure_clock(); /* Error enabling the clock source */
13
  }
14
  
15
  /* Configure flash wait states before switching to high frequency clock */
16
  system_flash_set_waitstates(2);
17
  
18
  /* Change system clock to DFLL */
19
  struct system_gclk_gen_config config_gclock_gen;
20
  system_gclk_gen_get_config_defaults(&config_gclock_gen);
21
  config_gclock_gen.source_clock = SYSTEM_CLOCK_SOURCE_DFLL;
22
  config_gclock_gen.division_factor = 1;
23
  system_gclk_gen_set_config(GCLK_GENERATOR_0, &config_gclock_gen);
24
}



Das WEX Problem war ärgerlich denn ich hab einfach nur die Reinfolge 
vertauscht hier eine laufende Version
1
// Globale Variablen
2
struct tcc_module tcc_instance;
3
4
static void configure_tcc(void)
5
{
6
  struct tcc_config config_tcc;
7
  tcc_get_config_defaults(&config_tcc, TCC0);
8
  
9
  config_tcc.counter.period = PERIODE;
10
  
11
  config_tcc.compare.wave_generation = TCC_WAVE_GENERATION_SINGLE_SLOPE_PWM;
12
  
13
  config_tcc.pins.enable_wave_out_pin[1] = true;
14
  config_tcc.pins.enable_wave_out_pin[5] = true;
15
  
16
  config_tcc.pins.wave_out_pin[1] = PIN_PA05F_TCC0_WO1;
17
  config_tcc.pins.wave_out_pin[5] = PIN_PA09F_TCC0_WO5;
18
  
19
  config_tcc.pins.wave_out_pin_mux[1] = MUX_PA05F_TCC0_WO1;
20
  config_tcc.pins.wave_out_pin_mux[5] = MUX_PA09F_TCC0_WO5;
21
  
22
  config_tcc.compare.match[1] = PERIODE/2;
23
  
24
  /* Invert the Waveform output[1] channel to view the DTI effect */
25
  //config_tcc.wave_ext.invert[1] = true;
26
  
27
  tcc_init(&tcc_instance, TCC0, &config_tcc);
28
  
29
  /* Enable the Dead Time Insertion Generator for the channel 1 (CC1) */
30
  TCC0->WEXCTRL.reg |= TCC_WEXCTRL_DTIEN1;
31
  
32
  /* Define the High s->e time and Low side time for Dead Time generation */
33
  TCC0->WEXCTRL.reg |= TCC_WEXCTRL_DTLS(0x20) | TCC_WEXCTRL_DTHS(0x20);
34
  
35
  tcc_enable(&tcc_instance);
36
}

In der main kann man dann mit
1
tcc_set_compare_value(&tcc_instance, 1, neuerWert);
den Compare Wert änder (die PWM)


Falls sich noch jemand mit dem Board beschäftigt bin ich immer offen für 
Anregungen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.